从字符串中获取转义的unicode代码

时间:2014-12-11 21:25:23

标签: python unicode escaping

我似乎和开发界的其他人一样面临着相反的问题。我需要从字符串生成转义字符。例如,假设我有MESSAGE:这个词,我需要生成:

\\u004D\\u0045\\u0053\\u0053\\u0041\\u0047\\u0045\\u003A\\u0053\\u0069\\u006D

我使用Python最接近的是:

u'MESSAGE:'.encode('utf16')
# output = '\xff\xfeM\x00E\x00S\x00S\x00A\x00G\x00E\x00:\x00'

我的第一个想法是我可以用\x取代\u00(或者那种效果),但我很快就意识到这不起作用。如何在Python中输出转义(未转义?)字符串(最好)?

在每个人开始“回答”并进行投票之前,转义的\u00...字符串是我的应用从另一个我无法控制的第三方应用获得的字符串。我正在尝试生成自己的测试数据,因此我不必依赖第三方应用程序。

3 个答案:

答案 0 :(得分:2)

皮埃尔的回答几乎是正确的,但除了使用UTF-16的“窄版本”(主要是Windows上的Python 1.6-3.2)之外,for x in u'MESSAGE:'位对于U + FFFF以上的字符会失败用于Unicode字符串。

在“广泛构建”(以及不再存在区别的3.3+)中,len(unichr(0x10000))1而不是2。当此代码点为UTF-16BE编码时,您将获得两个占用四个字节的代理,因此输出为'\\uD800DC00'而不是您可能想要的u'\\uD800\\uDC00'

要在Python的两种变体上覆盖它,您可以这样做:

>>> h = u'MESSAGE:\U00010000'.encode('utf-16be').encode('hex')
# '004d004500530053004100470045003ad800dc00'
>>> ''.join(r'\u' + h[i:i+4] for i in range(0, len(h), 4))
'\\u004d\\u0045\\u0053\\u0053\\u0041\\u0047\\u0045\\u003a\\ud800\\udc00'

答案 1 :(得分:1)

我认为这个(快速和肮脏)代码可以满足您的需求:

''.join('\\u' + x.encode('utf_16_be').encode('hex') for x in u'MESSAGE:')
# output: '\\u004d\\u0045\\u0053\\u0053\\u0041\\u0047\\u0045\\u003a'

或者如果您想要更多' \':

''.join('\\\\u' + x.encode('utf_16_be').encode('hex') for x in u'MESSAGE:')
# output: '\\\\u004d\\\\u0045\\\\u0053\\\\u0053\\\\u0041\\\\u0047\\\\u0045\\\\u003a'
print _
# output: \\u004d\\u0045\\u0053\\u0053\\u0041\\u0047\\u0045\\u003a

如果绝对需要十六进制代码的大写字母:

''.join('\\u' + x.encode('utf_16_be').encode('hex').upper() for x in u'MESSAGE:')
# output: '\\u004D\\u0045\\u0053\\u0053\\u0041\\u0047\\u0045\\u003A'

答案 2 :(得分:0)

如果您没有BMP之外的字符(> 0xFFFF),则无需通过.encode()步骤:

>>> ''.join('\\u{:04x}'.format(ord(a)) for a in u'Message')
'\\u004d\\u0065\\u0073\\u0073\\u0061\\u0067\\u0065'