我知道如何从'u \ u4f60 \ u597d'获得'4f60597d'
>>> u_str= u'你好'
>>> repr(u_str).replace('\u', '')[2:-1]
'4f60597d'
但是如果字符串中有一些ascii:
>>> u_str= u'12你好'
>>> repr(u_str).replace('\u', '')[2:-1]
'124f60597d'
这是不我想要的结果。
我希望我能得到如下输出:003100324f60597d
答案 0 :(得分:5)
您可以使用ord()
为每个字符获取整数代码点,而不是格式化:
''.join(format(ord(c), '04x') for c in u_str)
演示:
>>> u_str = u'12你好'
>>> ''.join(format(ord(c), '04x') for c in u_str)
'003100324f60597d'
或者您可以编码为UTF-16(大端)并在结果上使用binascii.hexlify()
;这可能是更快的选择:
from binascii import hexlify
hexlify(u_str.encode('utf-16-be'))
演示:
>>> from binascii import hexlify
>>> hexlify(u_str.encode('utf-16-be'))
'003100324f60597d'
后者还处理BMP之外的字符,每个代码点需要4个字节,这将使用UTF-16代理对进行编码:
>>> hexlify(u'\U0001F493'.encode('utf-16-be'))
'd83ddc93'