繁体   English   中英

Python ascii utf unicode

[英]Python ascii utf unicode

当我用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 只是通过为您提供 ASCII 友好的表示来尝试使调试更容易。 在解释器中回显值为您提供对结果调用repr()的结果。

换句话说,您将值的表示与值本身混淆了。 该表示旨在安全地复制和粘贴,而无需担心其他系统可能如何处理非 ASCII 代码点。 因此,使用 Python 字符串文字语法,将任何不可打印和非 ASCII 字符替换为\\xhh\\uhhhh \\xhh转义序列。 将这些字符串粘贴回 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()函数仍然为您提供 Python 2 repr()行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM