0

Unicode の 16 進表現について混乱しています。単一の数学積分記号文字を含むサンプル ファイルがあります。それは U+222B です。ファイルを cat するか、vi で編集すると、積分記号が表示されます。ファイルの 16 進ダンプは、その 16 進コンテンツが 88e2 0aab であることを示しています

Python では、統合された Unicode 文字を作成し、p レンダリングを端末と統合記号に出力できます。

>>> p=u'\u222b'
>>> p
u'\u222b'
>>> print p
∫

私を混乱させるのは、整数記号を含むファイルを開くことができ、整数記号を取得できますが、16 進数の内容が異なることです。

>>> c=open('mycharfile','r').read()
>>> c
'\xe2\x88\xab\n'
>>> print c
∫

1 つは Unicode オブジェクトで、もう 1 つはプレーンな文字列ですが、明らかに同じ文字に対する 2 つの 16 進コードの関係は何ですか? どうすれば手動で変換できますか?

4

2 に答える 2

3

プレーン文字列は、Unicode コード ポイントをバイト単位で表すさまざまな方法の 1 つである UTF-8 を使用してエンコードされています。UTF-8 は、ASCII のスーパーセットであるという便利な機能を備えたマルチバイト エンコーディングです。同じバイトが、任意の ASCII 文字を UTF-8 または ASCII にエンコードします。

Python 2.x では、encodeUnicode オブジェクトでメソッドを使用してエンコードし、decodeコンストラクターを使用unicodeしてデコードします。

>>> u'\u222b'.encode('utf8')
'\xe2\x88\xab'
>>> '\xe2\x88\xab'.decode('utf8')
u'\u222b'
>>> unicode('\xe2\x88\xab', 'utf8')
u'\u222b'

printUnicode 引数を指定すると、それを暗黙的にエンコードします。私のシステムでは:

>>> sys.stdout.encoding
'UTF-8'

printの動作 に関するより長い説明については、この回答を参照してください:デフォルトのエンコーディングが ASCII の場合、Python はなぜユニコード文字を出力するのですか?

Python 3 では処理が少し異なります。変更はここに文書化されています: http://docs.python.org/3.0/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit

于 2013-09-10T22:05:26.237 に答える