[英]How to get UTF-16 (decimal) in Python?
我有一个表示为U + 1F498的表情符号的Unicode Code Point:
emoticon = u'\U0001f498'
我想得到这个字符的utf-16十进制组,根据这个网站是55357
和56472
。
我试图print emoticon.encode("utf16")
但根本没有帮助我,因为它提供了一些其他角色。
此外,尝试从UTF-8解码之前将其编码为UTF-16,如下所示print str(int("0001F498", 16)).decode("utf-8").encode("utf16")
也无济于事。
如何正确获取unicode字符的utf-16十进制组?
可以encode
与字符utf-16
编码,然后每2个字节的编码数据的转换为整数与int.from_bytes
(或struct.unpack
在python 2)。
def utf16_decimals(char, chunk_size=2):
# encode the character as big-endian utf-16
encoded_char = char.encode('utf-16-be')
# convert every `chunk_size` bytes to an integer
decimals = []
for i in range(0, len(encoded_char), chunk_size):
chunk = encoded_char[i:i+chunk_size]
decimals.append(int.from_bytes(chunk, 'big'))
return decimals
import struct
def utf16_decimals(char):
# encode the character as big-endian utf-16
encoded_char = char.encode('utf-16-be')
# convert every 2 bytes to an integer
decimals = []
for i in range(0, len(encoded_char), 2):
chunk = encoded_char[i:i+2]
decimals.append(struct.unpack('>H', chunk)[0])
return decimals
结果:
>>> utf16_decimals(u'\U0001f498')
[55357, 56472]
在Python 2“窄”构建中,它很简单:
>>> emoticon = u'\U0001f498'
>>> map(ord,emoticon)
[55357, 56472]
这适用于Python 2(窄版和宽版)和Python 3:
from __future__ import print_function
import struct
emoticon = u'\U0001f498'
print(struct.unpack('<2H',emoticon.encode('utf-16le')))
输出:
(55357, 56472)
这是一个更通用的解决方案,可以为任意长度的字符串打印UTF-16代码点:
from __future__ import print_function,division
import struct
def utf16words(s):
encoded = s.encode('utf-16le')
num_words = len(encoded) // 2
return struct.unpack('<{}H'.format(num_words),encoded)
emoticon = u'ABC\U0001f498'
print(utf16words(emoticon))
输出:
(65, 66, 67, 55357, 56472)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.