エンコーディングの問題は、PySide/Qt がシステム エンコーディングに従って解釈しようとしている UTF-8 文字列を渡しているように見えます。これは、Latin-1 と互換性があります (cp1252 など、西ヨーロッパ言語の従来の Windows デフォルト)。 UTF-8 ではなく。これは非常に簡単に確認できます。
>>> print u'm\u00b2'.encode('utf-8').decode('latin-1')
m²
PySide はunicode
どこでも文字列を使用できます。そのため、PySide へのインターフェイスを含め、/unicode
の代わりにどこでも使用するだけで問題ありません。str
bytes
特殊文字として定義されていない指数 (m^8 など) を出力する方法はありますか?
⁸ (U+2078)は特殊文字として定義されており、ここで入力できたことからも明らかです。
ただし、式を解析して適切な上付き文字を生成するには、独自のコードを作成する必要があります。
U+2070 から U+209F の上付き文字と下付き文字ブロックには、U+00B2 と U+00B3 の Latin-1 互換位置に残されている 2 と 3 を除いて、必要なすべての文字が含まれています。(一部のフォントは U+2072 と U+2073 を同等の文字として表示しますが、それらのフォントは正しくないため、それに依存するべきではありません。また、1 は U+2071 と U+00B9 の両方として表示され、一部のフォントでは区別されます。リスト全体を印刷して、どのリストが自分に適しているかを確認することもできます。)
各数字を上付き文字に変換する関数は次のようになります。
def superscript(digit):
if digit in (2, 3):
return unichr(0x00B0 + digit)
else:
return unichr(0x2070 + digit)
したがって、非常に単純なラッパーは次のようになります。
def term(base, exponent):
return base + u''.join(superscript(int(digit)) for digit in exponent)
今:
>>> print term('x', '123')
xⁱ²³
ただし、より柔軟なものが必要な場合は、プレーン テキストの代わりに HTML を生成することをお勧めします。Qt の最近のバージョンでは、HTML を直接QLabel
.
式から MathML や Latex などを生成できる場合は、それらの形式から HTML を生成するツールがあります。
しかし、本当に些細な例としては:
def term(base, exponent):
return u'{}<sup>{}</sup>'.format(base, exponent)
印刷すると、これは単に表示されますx<sup>123</sup>
が、QLabel
(またはスタックオーバーフローの回答)でスタックすると、 x 123と表示されます。
私はこのエンコーディング行を使用しています: # -*-coding:Latin-1 -*
.
なんで?UTF-8 でテキスト ファイルを編集できるようになれば、作業がずっと楽になります。u'm\2074'
1 つには、Latin-1 には 1、2、および 3 以外の上付き文字の文字がありません。u'm⁴'
また、完全ではありませんがほぼ emacs 形式のコーディング宣言を使用するのは、少し誤解を招きます。いずれかの emacs 形式を使用します (最後のハイフンと適切なスペースを使用):
# -*- coding: Latin-1 -*-
…またはしないでください:
# coding=Latin-1
とにかく、エンコーディング行が行うことは、Python に文字列リテラルを解釈する方法を伝えることだけです。非unicode
リテラル (u
プレフィックスなし) を作成した場合でもdecode
、ある時点でそれらを作成する必要があります。また、自分でデコードを行わない場合、PySide は推測する必要があり、システム エンコーディング (おそらく cp1252 です。これは上付き文字については Latin-1 に十分近いですが、UTF-8 には十分近くありません) を推測します。 )。
したがって、すべての問題を解決するには:
- 可能であれば、UTF-8 エンコーディングを使用してください。
- UTF-8 エンコーディングを使用できない場合は、明示的な Unicode エスケープまたは文字列の動的生成を使用して、Latin-1 がリテラルにない文字を処理します。
- すべてのリテラルを Unicode にします。
- コード内で可能な限り Unicode 文字列を使用します。
- どこかにバイト文字列が必要な場合は、Python/PySide/Qt に推測させるのではなく、明示的にエンコード/デコードしてください。