u'\u4132'
として表される16ビットのビッグエンディアンUnicode文字列があります。
pythonで整数41と32に分割するにはどうすればよいですか?
ここにあなたがそれを望むかもしれないさまざまな異なる方法があります。
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']
"\u4132".getBytes("UTF-16BE")
u'\u4132'.encode('utf-16be')
'\u4132'.encode('utf-16be')
これらのメソッドはバイト配列を返します。これは、int配列に簡単に変換できます。ただし、U+FFFF
より上のコードポイントは2つのコードユニットを使用してエンコードされることに注意してください(したがって、UTF-16BEではこれは32ビットまたは4バイトを意味します)。
>>> c = u'\u4132'
>>> '%x' % ord(c)
'4132'
「これら」は整数ではなく、 コードポイント を表す16進数です。
コードポイントの整数表現を取得する場合は、ord(u'\u4132')
を使用する必要があります。これをユニコード文字に変換し直す場合は、unicode()
を使用してユニコード文字列を返します。
ダーティハック:repr(u'\u4132')
は"u'\\u4132'"
を返します
ユニコード文字を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ではこれらのコードをエンコードするために代理ペアが必要になるためです。ポイント。