web-dev-qa-db-ja.com

python)のUnicode文字列からバイトを取得する

u'\u4132'として表される16ビットのビッグエンディアンUnicode文字列があります。

pythonで整数41と32に分割するにはどうすればよいですか?

9
altunyurt

ここにあなたがそれを望むかもしれないさまざまな異なる方法があります。

Python 2:

>>> chars = u'\u4132'.encode('utf-16be')
>>> chars
'A2'
>>> ord(chars[0])
65
>>> '%x' % ord(chars[0])
'41'
>>> hex(ord(chars[0]))
'0x41'
>>> ['%x' % ord(c) for c in chars]
['41', '32']
>>> [hex(ord(c)) for c in chars]
['0x41', '0x32']

Python 3:

>>> chars = '\u4132'.encode('utf-16be')
>>> chars
b'A2'
>>> chars = bytes('\u4132', 'utf-16be')
>>> chars  # Just the same.
b'A2'
>>> chars[0]
65
>>> '%x' % chars[0]
'41'
>>> hex(chars[0])
'0x41'
>>> ['%x' % c for c in chars]
['41', '32']
>>> [hex(c) for c in chars]
['0x41', '0x32']
15
Chris Morgan
  • Java:"\u4132".getBytes("UTF-16BE")
  • Python 2:u'\u4132'.encode('utf-16be')
  • Python 3:'\u4132'.encode('utf-16be')

これらのメソッドはバイト配列を返します。これは、int配列に簡単に変換できます。ただし、U+FFFFより上のコードポイントは2つのコードユニットを使用してエンコードされることに注意してください(したがって、UTF-16BEではこれは32ビットまたは4バイトを意味します)。

4
Roland Illig
>>> c = u'\u4132'
>>> '%x' % ord(c)
'4132'
2
jfs

「これら」は整数ではなく、 コードポイント を表す16進数です。

コードポイントの整数表現を取得する場合は、ord(u'\u4132')を使用する必要があります。これをユニコード文字に変換し直す場合は、unicode()を使用してユニコード文字列を返します。

2
Ivo Wetzel

ダーティハック:repr(u'\u4132')"u'\\u4132'"を返します

1
seriyPS

ユニコード文字をord()に渡してコードポイントを取得し、そのコードポイントをint.to_bytes()で個々のバイトに分割してから、出力を必要に応じてフォーマットします。

list(map(lambda b: hex(b)[2:], ord('\u4132').to_bytes(4, 'big')))

戻り値: ['0', '0', '41', '32']

list(map(lambda b: hex(b)[2:], ord('\N{PILE OF POO}').to_bytes(4, 'big')))

戻り値: ['0', '1', 'f4', 'a9']

別のコメントで述べたように、コードポイントをutf16にエンコードすると、BMP(Basic Multilingual Plane)の外側のコードポイントでは期待どおりに機能しません。UTF16ではこれらのコードをエンコードするために代理ペアが必要になるためです。ポイント。