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

Python 从字符串中获取转义的unicode代码,python,unicode,escaping,Python,Unicode,Escaping,我似乎和发展世界的其他人有着相反的问题。我需要从字符串中生成转义字符。例如,假设我有单词消息:,我需要生成: \\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' 我的第

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

\\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'
我的第一个想法是我可以用
\u00
(或者类似的东西)来代替
\x
,但我很快意识到这是行不通的。我可以做什么来输出Python中的转义(未转义?)字符串(最好是)

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

我认为这段(快速和肮脏)代码符合您的要求:

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

Pierre的答案几乎是正确的,但是对于u+FFFF以上的字符,位将失败,除了使用UTF-16表示Unicode字符串的“窄版本”(在Windows上主要是Python 1.6–3.2)之外

在“宽版本”(以及在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'

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


你恢复了我对法国人的信心。非常感谢。现在我必须解释这些东西到底是什么让我问这个。你怎么知道要做这些编码的?我甚至不知道从哪里开始研究这个主题(编码)。它们被称为“编解码器”。你会在那里找到帮助:谢谢。我确实明白你答案的重要性,但我没有超过u+FFFF的字符(至少从我能告诉你的)。因此,对于我的需要,皮埃尔的代码就足够了。我能做的最好的事情就是投票表决你的答案。是的,这更多的是一个额外的评论(但太大了,不能在评论中加入!)我可能说得太早了,不需要在BMP(>u+ffff)的一侧使用字符。虽然我们的应用程序不支持它,但我的应用程序可能会在BMP之外接收MSG。所以像
u'\xf3'
(==ó)这样的东西会对我造成严重破坏。因此,我可能不得不将我的答案更改为bobince提供的答案。
>>> ''.join('\\u{:04x}'.format(ord(a)) for a in u'Message')
'\\u004d\\u0065\\u0073\\u0073\\u0061\\u0067\\u0065'