【问题标题】:Representing non-English characters with Unicode (UTF-8)使用 Unicode (UTF-8) 表示非英文字符
【发布时间】:2018-06-12 14:57:16
【问题描述】:

我正在使用 Python 中的 HTML 字符串,其中包含非英文字符,该字符串在字符串中由 16 位 unicode 十六进制值表示。字符串内容为:

"Skr\u00E4ddarev\u00E4gen"

正确转换后的字符串应为“Skräddarevägen”。我如何确保 unicode 十六进制值在输出时正确编码/解码并以正确的重音符号读取?

(注意,我使用的是 Requests 和 Pandas,两者的编码都设置为 utf-8) 提前致谢!

【问题讨论】:

    标签: python unicode encoding utf-8 decoding


    【解决方案1】:

    根据您的显示,很难确定字符串中的内容。假设是显示的 24 个字符,我相信下面的最后一行回答了你的问题。

    s = "Skr\\u00E4ddarev\\u00E4gen"
    print(len(s))
    for c in s: print(c, end=' ')
    print()
    print(eval("'"+s+"'"))
    print(eval("'"+s+"'").encode('utf-8'))
    

    打印出来

    24
    S k r \ u 0 0 E 4 d d a r e v \ u 0 0 E 4 g e n 
    Skräddarevägen
    b'Skr\xc3\xa4ddarev\xc3\xa4gen'
    

    【讨论】:

      【解决方案2】:

      如果您使用的是 Python 3,而这实际上就是字符串的内容,那么它“可以正常工作”:

      >>> s = "Skr\u00E4ddarev\u00E4gen"
      >>> s
      'Skräddarevägen'
      

      如果您将该字符串作为原始数据,则必须对其进行解码。如果它是 Unicode 字符串,则必须先将其编码为字节。最终结果将是 Unicode。如果您已经有一个字节字符串,请跳过编码步骤。

      >>> s = r"Skr\u00E4ddarev\u00E4gen"
      >>> s
      'Skr\\u00E4ddarev\\u00E4gen'
      >>> s.encode('ascii').decode('unicode_escape')
      'Skräddarevägen'
      

      如果您使用的是 Python 2,则需要解码并打印才能正确查看:

      >>> s = "Skr\u00E4ddarev\u00E4gen"
      >>> s
      'Skr\\u00E4ddarev\\u00E4gen'
      >>> s.decode('unicode_escape')
      u'Skr\xe4ddarev\xe4gen'
      >>> print s.decode('unicode_escape')
      Skräddarevägen
      

      【讨论】:

      • .encode('ascii').decode('unicode_escape') 似乎已经解决了这个问题。感谢您的帮助!
      • @George 欢迎来到 SO!如果答案有用,请点赞,如果是最佳答案,请选择左侧的勾选接受它作为答案。
      【解决方案3】:

      在 Python 3 中,可能会发生以下情况:

      1. 如果从 HTML 文件中提取字符串,则必须读入 使用正确编码的 HTML 文件。
      2. 如果您的字符串包含在 Python 3 代码中,则它应该已经在内存中以 Unicode(32 位)的形式存在。

      将字符串写入文件,您必须在打开的文件中指定您想要的编码。

      【讨论】:

      • 这在 Python 3 中似乎是如此自动和免提。我们仍在使用 Python 2.7,我会尝试相同的。
      猜你喜欢
      • 1970-01-01
      • 2016-05-20
      • 2018-09-14
      • 2010-12-26
      • 1970-01-01
      • 2016-09-08
      • 2023-03-17
      • 2019-03-08
      • 1970-01-01
      相关资源
      最近更新 更多