0

m^2コンピューティング プログラム用の Qt インターフェイスを作成していますが、面積の単位 (つまり、または m²の LaTex 出力) を書きたいと考えています。

このコードで特殊な ² 文字を使用すると: area_label = QtGui.QLabel("m²")、GUI に次のように表示されます: m²

これはエンコーディングの問題である可能性があると思われます.探している二乗指数を書く方法は何ですか?

追加の質問:特殊文字として定義されていない指数 (たとえば)m^8を出力する方法はありますか?

追加情報: 私は、PySide バージョン 1.1.1、および Qt 4.7.4 を使用して、python 2.7.2 に取り組んでいます。Windows 7、SP1 で作業していますが、可能であればコードをクロスプラットフォームにしたいと考えています。

また、私は Windows で作業していて、フランス語のアクセント (àや などé) を使用しているため、ファイルの先頭でこのエンコード行を使用しています: # -*-coding:Latin-1 -*.

4

1 に答える 1

3

エンコーディングの問題は、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の代わりにどこでも使用するだけで問題ありません。strbytes


特殊文字として定義されていない指数 (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 に推測させるのではなく、明示的にエンコード/デコードしてください。
于 2013-06-18T19:16:45.580 に答える