Python 3.x 重新解释Unicode字符串

Python 3.x 重新解释Unicode字符串,python-3.x,unicode,utf-8,Python 3.x,Unicode,Utf 8,我从一个客户端接收unicode数据,存储在一个名为“data”的字典中。下面的代码 variable1 = '\u03b5\u0061\u0073\u0064\u0066' print("TYPE1 = " + str(type(variable1))) print("VAR1 = " + variable1) variable2 = data['text'] print("TYPE2 = " + str(type(variable2))) print("VAR2 = " + variabl

我从一个客户端接收unicode数据,存储在一个名为“data”的字典中。下面的代码

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

这取决于输入数据被破坏(或以某种特定方式编码)的一致性,但对于给定的示例,以下内容应起作用:

>>> data = '\\u03b5\\u0061\\u0073\\u0064\\u0066'
>>> print(data)
\u03b5\u0061\u0073\u0064\u0066
>>> text = data.encode('ascii').decode('unicode_escape')
>>> print(text)
εasdf
“unicode_转义”编解码器正是为Python风格的unicode转义而提供的。它还适用于格式为
\xNN
\u000nnnn
的转义,并混合了文字ASCII字符

需要注意的几点:

  • .encode('ascii')
    步骤是必要的,因为
    .decode
    只存在于
    字节中,而不存在
    str
  • 如果您混合使用非ASCII文本和Unicode转义(在Python
    str
    literals中是允许的),您可以尝试
    encode('utf-8')
    ,但我还没有考虑清楚这一点
  • eval
    在这里不起作用,因为数据周围没有引号
  • 您的数据可能来自JSON,在JSON中也存在转义符
    \unnn
    (但不是
    \xNN
    \u000nnn
    转义符)。如果是这种情况,您必须单独处理U+FFFF以上的字符(例如emojis),这些字符由代理项对表示
    • 转义unicode(下面的JavaScript示例)

      在发送数据和使用

      input.encode(“utf-8”).decode(“unicode-escape”)


      似乎有效。

      用您的建议和结果更新了我的问题。数据确实来源于JSON。您是否尝试过
      .encode('utf-8')
      而不是ASCII?也许你也可以更新你的例子来重现UnicodeEncodeError(UnicodeEncodeError)
      。我不知道在没有客户端发送的情况下如何重现它(这会使它简单得多)。在pythonshell中,打印这些文本可以获得正确的输出。我猜
      str=“ε”
      是最接近的东西:如果你能把它变成一个
      ε,那么我猜它会起作用。看起来
      “ε”
      确实是实际收到的。那么
      u'\u03b5\u0061\u0073\u0064\u0066'
      呢?
      >>> data = '\\u03b5\\u0061\\u0073\\u0064\\u0066'
      >>> print(data)
      \u03b5\u0061\u0073\u0064\u0066
      >>> text = data.encode('ascii').decode('unicode_escape')
      >>> print(text)
      εasdf
      
      function escapeUnicode(str) {
          return str.replace(/[^\0-~]/g, function(ch) {
              return "\\u" + ("000" + ch.charCodeAt().toString(16)).slice(-4);
          });
      }