重新解释Unicode字符串

时间:2018-08-21 16:25:41

标签: python-3.x unicode utf-8

我正在从客户端接收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'

2 个答案:

答案 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
  • 如果您混合使用非ASCII文字和Unicode转义符(如Python str文字中所允许的),则可以尝试encode('utf-8'),但我还没有想到。
  • eval在这里不起作用,因为数据周围没有引号。
  • 您的数据可能源自JSON,其中还存在\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')

似乎可以正常工作。