【问题标题】:Python ascii utf unicodePython ascii utf unicode
【发布时间】:2014-12-02 18:02:31
【问题描述】:

当我使用 p = xml.parsers.expat.ParserCreate() 解析这个 XML 时:

<name>Fortuna D&#252;sseldorf</name>

字符解析事件处理程序包括u'\xfc'

u'\xfc'如何变成u'ü'


这是这篇文章的主要问题,其余的只是展示了关于它的进一步(咆哮)想法

自从u'\xfc' 应该产生u'ü' 之后,Python unicode 不是被破坏了吗? u'\xfc' 已经是一个 unicode 字符串,因此再次将其转换为 unicode 不起作用! 将其转换为 ASCII 也不起作用。

我发现唯一有效的是:(这不是故意的,对吗?)

exec( 'print u\'' + 'Fortuna D\xfcsseldorf'.decode('8859') + u'\'')

用 utf-8 替换 8859 失败!那有什么意义呢?

Python unicode HOWTO 还有什么意义? - 它只给出了失败的例子,而不是展示如何进行转换(尤其是在这里提出类似问题的数百人)在现实世界的实践中实际使用。

Unicode 不是魔法——为什么这里有这么多的人有问题?

unicode 转换的根本问题很简单:

一个双向查找表 '\xFC' u'ü'

unicode( 'Fortuna D\xfcsseldorf' ) 

为什么 Python 的创建者认为最好显示错误而不是简单地生成:u'Fortuna Düsseldorf'

还有为什么他们让它不可逆?:

 >>> u'Fortuna Düsseldorf'.encode('utf-8')
 'Fortuna D\xc3\xbcsseldorf'
 >>> unicode('Fortuna D\xc3\xbcsseldorf','utf-8')
 u'Fortuna D\xfcsseldorf'    

【问题讨论】:

  • 你用的是什么版本的python? Python 3 比 2 显着改进了 unicode 支持。
  • 我已建议对问题进行修改,但请查看 How do I ask a good question? 最值得注意的是,将问题保留为 1 个问题是一种很好的做法。
  • 咆哮说你不明白事情是如何运作的,只是表明你自己的无知。
  • 在咆哮中,你让我想起了this talk;您希望事情比实际情况更简单。

标签: python unicode encoding utf-8 python-2.x


【解决方案1】:

已经拥有价值。 Python 只是试图通过为您提供一个 ASCII 友好的表示来使 调试 更容易。在解释器中回显值会为您提供在结果上调用 repr() 的结果。

换句话说,您将值的表示与值本身混淆了。该表示旨在安全地复制和粘贴,而不必担心其他系统如何处理非 ASCII 代码点。因此,使用 Python string literal syntax,任何不可打印和非 ASCII 字符都替换为 \xhh\uhhhh 转义序列。将这些字符串粘贴回 Python 字符串或交互式 Python 会话将重现完全相同的值。

因此ü 已被\xfc 取代,因为这是U+00FC LATIN SMALL LETTER U WITH DIAERESIS 代码点的Unicode 代码点

如果您的终端配置正确,您可以只使用print,Python 会将 Unicode 值编码为您的终端编解码器,从而使您的终端显示为您提供非 ASCII 字形:

>>> u'Fortuna Düsseldorf'
u'Fortuna D\xfcsseldorf'
>>> print u'Fortuna Düsseldorf'
Fortuna Düsseldorf

如果您的终端配置为 UTF-8,您还可以在显式编码后将 UTF-8 字节直接写入您的终端:

>>> u'Fortuna Düsseldorf'.encode('utf8')
'Fortuna D\xc3\xbcsseldorf'
>>> print u'Fortuna Düsseldorf'.encode('utf8')
Fortuna Düsseldorf

替代方法是升级到 Python 3; repr() 仅对没有可打印字形的代码点(控制代码、保留代码点、代理项等)使用转义序列;如果代码点不是空格但属于 C*Z* 通用类别,则将其转义)。新的 ascii() function 仍为您提供 Python 2 repr() 行为。

【讨论】:

  • 我相信 Python 3 可能会发生变化,在repr 中不仅可以显示 ASCII。
  • @MarkRansom:是的,Python 3 更相信现代系统能够处理 Unicode。您始终可以使用 ascii() 而不是 repr() 来获得 Python 2 的行为。
猜你喜欢
  • 2013-03-22
  • 2014-02-13
  • 2014-01-14
  • 2010-10-16
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多