我正在从客户端接收unicode数据,该数据存储在称为“数据”的字典中。以下代码
variable1 = '\u03b5\u0061\u0073\u0064\u0066'
print("TYPE1 = " + str(type(variable1)))
print("VAR1 = " + variable1)
variable2 = data['text']
print("TYPE2 = " + str(type(variable2)))
print("VAR2 = " + variable2)
打印
TYPE1 = <class 'str'>
VAR1 = εasdf
TYPE2 = <class 'str'>
VAR2 = \u03b5\u0061\u0073\u0064\u0066
这表明来自客户端的数据以某种方式无法正确解释。将变量写入文件也将获得完全相同的结果:文件的文字为“ \ u03b5 \ u0061 \ u0073 \ u0064 \ u0066”。如何才能“重新解释”该unicode字符串,以便获得与内联变量相同的结果?
以下内容无效:
eval(variable2)
(错误:“行后出现意外字符
连续字符”)有了print(variable2.encode().decode())
,我得到VAR2 = ε
。
使用.encode('ascii').decode('unicode_escape')
,我得到UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
在外壳中:
>>> "\u03b5\u0061\u0073\u0064\u0066"
'εasdf'
答案 0 :(得分:1)
这取决于输入数据被破坏(或以某种特定方式编码)的一致性,但是对于给定的示例,以下内容应该起作用:
>>> data = '\\u03b5\\u0061\\u0073\\u0064\\u0066'
>>> print(data)
\u03b5\u0061\u0073\u0064\u0066
>>> text = data.encode('ascii').decode('unicode_escape')
>>> print(text)
εasdf
“ unicode_escape”编解码器正是为Python样式的Unicode转义提供的。它也可以使用\xNN
和\U000NNNNN
格式的转义符,并与文字ASCII字符混合。
一些注意事项:
.encode('ascii')
步骤是必需的,因为.decode
仅存在于bytes
,而不是str
。str
文字中所允许的),则可以尝试encode('utf-8')
,但我还没有想到。eval
在这里不起作用,因为数据周围没有引号。\uNNNN
转义符(但\xNN
和\U000NNNNN
不存在)。在这种情况下,您必须单独处理U + FFFF以上的字符(例如,表情符号),这些字符由代理对表示。答案 1 :(得分:0)
转义unicode(下面的JavaScript示例)
function escapeUnicode(str) {
return str.replace(/[^\0-~]/g, function(ch) {
return "\\u" + ("000" + ch.charCodeAt().toString(16)).slice(-4);
});
}
在发送数据并使用之前
input.encode("utf-8").decode('unicode-escape')
似乎可以正常工作。