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



我似乎遇到了与发展世界中的其他人相反的问题。我需要从字符串中生成转义字符。例如,假设我有单词MESSAGE:,我需要生成:

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

我使用Python能得到的最接近的东西是:

u'MESSAGE:'.encode('utf16')
# output = 'xffxfeMx00Ex00Sx00Sx00Ax00Gx00Ex00:x00'

的第一个想法是我可以用u00(或类似的东西)代替x,但我很快意识到这是行不通的。我该怎么做才能在Python中输出转义(未转义?)字符串(最好)?

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

Pierre的回答几乎是正确的,但是对于U + FFFF以上的字符,for x in u'MESSAGE:'位会失败,除了"窄构建"(主要是Windows上的Python 1.6-3.2)使用UTF-16作为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'

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

''.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'

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

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

最新更新