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

2024-10-01 22:26:43 发布

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

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

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

使用Python最接近我的是:

^{pr2}$

我的第一个想法是我可以用\u00代替{}(或者类似的东西),但是我很快意识到这行不通。如何输出转义的(未转义的?)Python中的字符串(最好是)?在

在所有人开始“回答”和拒绝投票之前,逃出的\u00...字符串是我的应用程序从另一个我无法控制的第三方应用程序获得的。我正在尝试生成我自己的测试数据,这样我就不必依赖第三方应用程序了。在


Tags: 字符串应用程序message单词pr2转义字符u00u0041
3条回答

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

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

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

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

或者如果你想要更多的“\”:

^{pr2}$

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

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

Pierre的答案几乎是正确的,但是对于U+FFFF以上的字符,for x in u'MESSAGE:'位将失败,除了“窄构建”(主要是在Windows上的Python1.6-3.2),它使用UTF-16作为Unicode字符串。在

在'wide builds'(在3.3+中,这种区别已经不存在,len(unichr(0x10000))1不是{}。当这个代码点是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'

相关问题 更多 >

    热门问题