2

私は過去にPython3.2をいじったことがありますが、今ではPythonでのutf-8エンコーディングに関してやや紛らわしい状況に直面しています。
たとえば、次のコードがあるとします。

'א'.encode()

結果はb'\xd7\x90'(または0xD790)ですが、これは間違っています。ヘブライ文字Alefのutf-8エンコーディングはであると想定されています0x5D0
ただし、エンコーディングとしてutf-16を使用すると、プレフィックスが0xFFFE:の正しい16進値が返されます。

'א'.encode('utf-16')

これはを返しますb'\xff\xfe\xd0\x05'

私の理解の基本的な何かが欠けているように感じます、
SOユーザー、私を教育するのを手伝ってください!

4

3 に答える 3

8

אUnicodeコードポイントはU+05D0 、または101 1101 0000バイナリです。11ビットコードポイントABCDEFGHIJKのUTF-8エンコーディング

110A BCDE  10FG HIJK
# i.e.
1101 0111  1001 0000 # binary
 d    7     9    0   # hex

または、Python表記では、b'\xd7\x90'

于 2012-05-28T19:39:35.947 に答える
6

0x5d0エンコーディングではありません。それは単なる数字です。はい、HEBREW LETTER ALEF は U+05D0 ですが、UTF-8 はコードポイントのバイトへの転写ではありません。代わりに、各バイトの MSb で特定の固定ビット セットを使用し、コードポイント値から可変数のビットを LSb に取り込みます。

0x5d0 = 101 1101 0000
      = 10111 010000

110xxxxx 10xxxxxxに挿入すると、次のようになります。

11010111 10010000 = 0xd7 0x90
于 2012-05-28T19:38:23.590 に答える
4

いいえ、のユニコードコードポイントאは0x5d0です。

print("%x" % ord('א'))  
# '5d0'

それをエンコードすると、utf-8その特定のコードポイントを表す1つの可能な方法が得られます。utf-16それを表す別の方法であり、2バイトを使用して各コードポイントを表します。プレフィックスを付ける理由は、バイト順マーク(BOM)\xff\xfeを生成するためです。encode('utf-16')バイト順序を明示的に指定した場合、それは生成されません。

>>> a='א'
>>> a.encode('utf-16')
b'\xff\xfe\xd0\x05'
>>> a.encode('utf-16-le')
b'\xd0\x05'
>>> a.encode('utf-16-be')
b'\x05\xd0'
于 2012-05-28T19:44:45.857 に答える