我似乎和开发界的其他人一样面临着相反的问题。我需要从字符串生成转义字符。例如,假设我有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...
字符串是我的应用从另一个我无法控制的第三方应用获得的字符串。我正在尝试生成自己的测试数据,因此我不必依赖第三方应用程序。
答案 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'