[英]Python ascii utf unicode
当我用p = xml.parsers.expat.ParserCreate()
解析这个 XML 时:
<name>Fortuna Dü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.