0

エンコードの問題を処理しています。私の入力は、次のようなユニコード文字列です。

>>> s
u'\xa6\xe8\xac\xc9'

実際には cp950 でエンコードされています。私はそれをデコードしたい: (「u」がないことに注意してください)

>>> print unicode('\xa6\xe8\xac\xc9', 'cp950')
西界

ただし、その「u」を取り除く方法がわかりません。直接変換が機能していません:

>>> str(s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

encode() を使用した結果は、私が望んでいたものではありません:

>>> s.encode('utf8')
'\xc2\xa6\xc3\xa8\xc2\xac\xc3\x89'

私が欲しいのは'\xa6\xe8\xac\xc9'

4

2 に答える 2

2

これは、このタイプのちょっとした乱用ですunicode。文字列内のunicode文字は Unicode コードポイント (例: u'\u897f\u754c') であると想定されるため、エンコーディングに依存しません。特定のエンコーディングのバイトであることは想定されていません (Python 3 では、Unicode 文字列strをバイト文字列 から分離することで、この区別を非常に明確にしていますbytes)。

各コードポイントをバイトとして解釈したいだけなので、次のことができます

u'\xa6\xe8\xac\xc9'.encode('iso-8859-1')

Unicode の最初の 256 コードポイントは、ISO-8859-1 のコードポイントと等しいと定義されているためです。ただし、そもそもこの間違った Unicode 文字列を与えた問題を修正してみてください。

于 2013-01-26T03:17:56.717 に答える
0

それでは、これを簡単に説明しましょう: Unicode コードポイントとして読み取られた一連のバイトがあり、代わりに cp950 として解釈する必要がありますか?

>>> ''.join(chr(ord(c)) for c in s)
'\xa6\xe8\xac\xc9'
>>> print ''.join(chr(ord(c)) for c in s).decode('cp950')
西界
于 2013-01-26T03:36:19.953 に答える