【问题标题】:Decoding Unicode in Python在 Python 中解码 Unicode
【发布时间】:2014-03-21 10:49:37
【问题描述】:

我有一个函数可以获取以 Unicode \u05D4\u... 编码的字符串作为变量 str,我想将该 Unicode 更改为字母,以便此 str 将包含翻译后的字符串。

我该怎么做?

【问题讨论】:

  • 不要命名你的变量 str。它是python中的一种类型
  • 你的命名是倒序的;您的字符串是 Unicode,并且其中已经包含字母。你想把它编码成字节。
  • 我强烈建议您阅读和/或观看nedbatchelder.com/text/unipain.html(如果他们以前没有看过这个网站,即使看到这个问题的每个人都可以这样做......)

标签: python string unicode


【解决方案1】:

实际上我们可以在这里处理两种类型的字符串。

第一个是 Python Unicode 字符串,其中字符串已经是一组 unicode 点。

这就是它在 Python 中的样子:

>>> x = u"\u1129\u1129"
>>> x
u'\u1129\u1129'

您实际上可以将其打印到屏幕上,因为 Python 打印函数通常使用支持此的编码。 (我相信是sys.stdout.encoding)

>>> print x
ᄩᄩ

如果您希望对此进行编码,您可能应该使用支持所有已知 Unicode 字符的 utf-8 编码。但是,您仍然需要 print 函数将其打印为可读字符。

但是,这种字符串很容易打印!我怀疑您将其输出到屏幕上会有任何问题。这就是为什么我相信你有第二种类型的字符串:


第二种类型的字符串是 Unicode 转义字符串,它可以在 Java .properties 文件之类的东西中找到(它们会强制您使用一些单字节的 ascii 编码变体)。这就是它在 Python 中的样子:

>>> escapedString = "\\u05D4\\u05D4\\u05D4"
>>> print escapedString
\u05D4\u05D4\u05D4

然后因为设计这些文件的人不知道Unicode and the basic essentials of character encoding,所以我们的工作就是将这些转义的代码点变成可读的字符。

>>> pythonUnicode = escapedString.decode("unicode-escape")
# This turns escaped unicode code points into Python unicode code points
>>> print pythonUnicode
ההה   

看起来我们有可读的字符!


但是,如果您有超出基本多语言平面(U+0 到 U+FFFF)的字符,您应该小心。有多种方法可以对超出基本两个字节的字符进行编码。例如:

Python 使用 \U(注意大写 U)和 8 个字符转义扩展字符。

>>> print "\\U0001D11E".decode("unicode-escape")
?
>>> print u"\U0001D11E"
?

rfc 指定了另一种转义:

转义不在基本多语言中的扩展字符 平面,字符表示为十二个字符的序列, 编码 UTF-16 代理对。因此,例如,一个字符串 仅包含 G 谱号字符 (U+1D11E) 可以表示为 “\uD834\uDD1E”。

所以请确保您知道您的数据来自哪里!

【讨论】:

  • 请注意,在第二种情况下,有许多不同的格式使用 \u 转义 - Python unicode 文字(unicode-escape 处理)、Java 属性、JavaScript 字符串文字、JSON 等等在。重要的是要知道您正在处理的是哪一个,因为它们对于其他哪些转义是有效的规则都略有不同。 unicode-escape 可能是也可能不是解析数据的有效方法,具体取决于数据的来源。
  • @bobince 谢谢,我不知道。添加了更多信息。添加了更多链接。抛弃了我对 Unicode 成为神奇统一标准的梦想。
【解决方案2】:

使用 u'..' 声明一个 unicode 字符串并使用 UTF-8 对其进行编码(UTF-8 是一种可变宽度编码,可以表示 Unicode 字符集中的每个字符)。

#!/usr/bin/evn python
a = u'\05D4\05D4'
print a.encode(utf-8')

>> xx

【讨论】:

    【解决方案3】:

    如果您有 Unicode 字符串,并且想要将其转换为可显示的字符,则需要选择您的编码。我假设您想在终端和正在运行的窗口上显示它?

    ustr = u'\u05D5'
    print ustr.encode('latin-1')
    

    现在有一些有趣的事情。您在示例中引用的序列不映射到 latin-1 编码中的任何合法字符,因此我建议您始终将“替换”指定为错误处理程序。即:

    print ustr.encode('latin-1', 'replace')
    

    注意:

    我看到字符集是希伯来语

    print ustr.encode('hebrew', 'replace') # alias for iso8859_8
    

    【讨论】:

    • 我没有冒犯任何人。 OP 没有指定编码。我猜想 Windows latin-1——演示如何编码。然后我对其进行了测试,发现它没有干净地编码为 latin-1,因此我展示了一个错误处理示例。但是现在我被贴上了麻木不仁的标签,因为我以某种方式读懂了他的想法,或者将每个编解码器都提交给了记忆?
    【解决方案4】:

    在赋值时将字符串编码为 un​​icode 并使用print 正确提示转义字符:

    >>> s = u'\u05D4\u...'
    >>> print s
    ה
    

    【讨论】:

      猜你喜欢
      • 2019-12-19
      • 2012-04-10
      • 2011-05-15
      • 1970-01-01
      • 2021-09-01
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多