如何在Python中生成\xescaped UTF8?

2024-10-01 13:25:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将unicode输入转换为UTF-8字节序列的\x转义、7位ascii-clean表示。在

这与我需要的类似,但是我想生成"\u222a",而不是"\xe2\x88\xaa"

>>> codecs.encode(u"\u222A", 'ascii', 'backslashreplace')
'\\u222a'

这看起来像是在生成所需的结果:

^{pr2}$

但这只是一种逃避的表现。实际结果不是12个ascii字节,而是3个UTF-8字节:

>>> [ord(c) for c in u"\u222A".encode('utf-8')]
[226, 136, 170]

我可以滥用这个逃过的陈述来得到我想要的,去掉repr补充道的前导和尾随引用:

>>> repr(u"\u222A".encode('utf-8'))[1:-1]
'\\xe2\\x88\\xaa'
>>> [ord(c) for c in repr(u"\u222A".encode('utf-8'))[1:-1]]
[92, 120, 101, 50, 92, 120, 56, 56, 92, 120, 97, 97]

恶心。这个稍微好一点:

>>> import binascii
>>> ''.join('\\x' + binascii.hexlify(c) for c in u"\u222A".encode('utf-8'))
'\\xe2\\x88\\xaa'
>>> [ord(c) for c in ''.join('\\x' + binascii.hexlify(c) for c in u"\u222A".encode('utf-8'))]
[92, 120, 101, 50, 92, 120, 56, 56, 92, 120, 97, 97]

是更好的方法吗?在


Tags: infor字节asciiutfencodexe2repr
2条回答
>>> u'\u222A'.encode('utf-8').encode('string-escape')
'\\xe2\\x88\\xaa'
>>> print u'\u222A'.encode('utf-8').encode('string-escape')
\xe2\x88\xaa

我不认为你会找到一个不难看的解决办法。这里有一个可以保留原始字符串中的任何ASCII字符,而不将它们转换为十六进制序列。在

''.join(c if 32 <= ord(c) <= 127 else '\\x{:02x}'.format(ord(c)) for c in u"\u222A".encode('utf-8'))

相关问题 更多 >