如何在Python中生成\ x-escaped UTF-8?

时间:2014-10-28 21:00:53

标签: python unicode utf-8 python-unicode

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

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

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

这看起来正在产生所需的结果:

>>> u"\u222A".encode('utf-8')
'\xe2\x88\xaa'

但这仅仅是逃脱的表现形式。实际结果是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]

这是一个更好的方法吗?

2 个答案:

答案 0 :(得分:1)

>>> u'\u222A'.encode('utf-8').encode('string-escape')
'\\xe2\\x88\\xaa'
>>> print u'\u222A'.encode('utf-8').encode('string-escape')
\xe2\x88\xaa

答案 1 :(得分:0)

我认为你不会找到一个不丑的解决方案。这是一个保留原始字符串中的任何ASCII字符而不将它们转换为十六进制序列的字符。

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