tho*_*ann 2 python unicode encoding utf-8 python-2.x
当我解析这个XML时p = xml.parsers.expat.ParserCreate():
<name>Fortuna Düsseldorf</name>
Run Code Online (Sandbox Code Playgroud)
字符解析事件处理程序包括u'\xfc'.
怎么可以u'\xfc'变成u'ü'?
这是这篇文章中的主要问题,其余的只是展示了关于它的进一步(咆哮)的想法
是不是Python unicode打破了,因为u'\xfc'屈服u'ü'而没有别的?你'xfc'已经是一个unicode字符串,所以再次将它转换为unicode不起作用!将其转换为ASCII也不起作用.
我发现的唯一有用的是:(这不是故意的,对吧?)
exec( 'print u\'' + 'Fortuna D\xfcsseldorf'.decode('8859') + u'\'')
Run Code Online (Sandbox Code Playgroud)
用utf-8替换8859会失败!那是什么意思?
还有什么是Python unicode HOWTO的意义? - 它只给出了失败的例子而不是显示如何进行转换(特别是在这里提出类似问题的ppl的houndreds)实际上在现实世界中使用.
Unicode并不神奇 - 为什么这么多ppl有问题?
unicode转换的根本问题很简单:
一个双向查找表'\ xFC'< - >u'ü'
unicode( 'Fortuna D\xfcsseldorf' )
Run Code Online (Sandbox Code Playgroud)
为什么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'
Run Code Online (Sandbox Code Playgroud)
你已经拥有了这个价值.Python只是通过为您提供ASCII友好的表示来简单地尝试使调试更容易.在解释器中回显值会为您提供调用repr()结果的结果.
换句话说,您将值的表示与值本身混淆.该表示旨在安全地复制和粘贴,而无需担心其他系统如何处理非ASCII代码点.因此,使用Python 字符串文字语法,将任何非可打印和非ASCII字符替换为\xhh和\uhhhh转义序列.将这些字符串粘贴回Python字符串或交互式Python会话将重现完全相同的值.
因此ü已被取代\xfc,因为这是Unicode的代码点为U + 00FC拉丁小字母U带二分法码点.
如果您的终端配置正确,您可以使用print,Python会将Unicode值编码到您的终端编解码器,从而使您的终端显示器为您提供非ASCII字形:
>>> u'Fortuna Düsseldorf'
u'Fortuna D\xfcsseldorf'
>>> print u'Fortuna Düsseldorf'
Fortuna Düsseldorf
Run Code Online (Sandbox Code Playgroud)
如果您的终端配置为UTF-8,您还可以在明确编码后直接将UTF-8字节写入终端:
>>> u'Fortuna Düsseldorf'.encode('utf8')
'Fortuna D\xc3\xbcsseldorf'
>>> print u'Fortuna Düsseldorf'.encode('utf8')
Fortuna Düsseldorf
Run Code Online (Sandbox Code Playgroud)
另一种方法是升级到Python 3; 有repr()只使用逃避不具有可打印的字形码点序列(控制码,保留码点,替代物,等等;如果码点是不是一个空间,但在下降C*或Z*一般类别,它被转义).新ascii()函数repr()仍然为您提供Python 2 行为.
| 归档时间: |
|
| 查看次数: |
2160 次 |
| 最近记录: |