Python2.X:为什么可以';我不能正确处理Unicode吗?
我已经用Python 2.X和unicode进行了一段时间的实验。但我已经到了一个毫无意义的地步 第一个问题: 一些代码将清楚地解释我的意思。txt变量用于模拟pyqt4 translate函数。返回一个QStringPython2.X:为什么可以';我不能正确处理Unicode吗?,python,unicode,pyqt4,python-2.x,Python,Unicode,Pyqt4,Python 2.x,我已经用Python 2.X和unicode进行了一段时间的实验。但我已经到了一个毫无意义的地步 第一个问题: 一些代码将清楚地解释我的意思。txt变量用于模拟pyqt4 translate函数。返回一个QString # -*- coding: utf-8 -*- from PyQt4 import QtCore txt = QtCore.QString(u'può essere / sarà / 日本語') txtUnicode1 = unicode(txt, errors='replace
# -*- coding: utf-8 -*-
from PyQt4 import QtCore
txt = QtCore.QString(u'può essere / sarà / 日本語')
txtUnicode1 = unicode(txt, errors='replace')
txtUnicode2 = unicode(txt)
当print()-ing这两个unicode字符串时,我得到:
蒲公英� 埃塞尔/特区� / ???
普埃塞尔/sará/日本語
当然,我可以通过使用QString.\uuu str\uuuu()得到同样的结果,但我的观点是理解,因此为了论证起见,我想知道:
- 为什么errors='replace'会在 它只应该在出错的情况下这样做
- 仅使用unicode(QString)生成QString是否有问题 转换为适合显示的unicode字符串
第二个问题: 我正在努力理解编码/解码
>>> a = u'può essere / sarà / 日本'
>>> b = a.encode('utf-8')
>>> a
u'pu\xf2 essere / sar\xe0 / \u65e5\u672c'
>>> b
'pu\xc3\xb2 essere / sar\xc3\xa0 / \xe6\x97\xa5\xe6\x9c\xac'
>>> print a
può essere / sarà / 日本
>>> print b
può essere / sarà / 日本
- 打印是否解码a和b
- 编码UTF-8应该是 完全解码?我不应该打印编码字符串吗
- 编码和解码的unicode字符串之间有什么区别
errors
参数unicode
与未传入且试图解码字符串时的行为不同。目前还不清楚它试图从什么编码中解码,但它可能认为它是utf-8,而实际上它是utf-16或类似的编码
print
语句将unicode字符串编码为终端使用的任何编码。这可能是ascii码,也可能是utf-8或其他什么print a
实际上是在幕后执行print a.encode('utf-8')
我还没有回答你所有的问题,但我链接的文章应该回答了大部分问题。希望这有帮助 让我们启动旧的待机、空闲,看看是否可以复制您看到的内容
IDLE 1.1.4
>>> a = u'può essere / sarà / 日本'
Unsupported characters in input
>>> a = u'pu\xf2 essere / sar\xe0 / \u65e5\u672c'
>>> b = a.encode('utf-8')
>>> a
u'pu\xf2 essere / sar\xe0 / \u65e5\u672c'
>>> b
'pu\xc3\xb2 essere / sar\xc3\xa0 / \xe6\x97\xa5\xe6\x9c\xac'
>>> print a
può essere / sarà / 日本
>>> print b
può essere / sarà / 日本
请注意,我在打印b
时看到了一些不同的内容。这是因为我的shell(IDLE)不将字节序列解释为UTF-8文本,而是使用我的平台字符编码cp1252
让我们再检查一下
>>> import sys
>>> sys.stdout.encoding
'cp1252'
是的,这就是为什么我的行为和你不一样。因为您的sys.stdout.encoding是UTF-8。这就是为什么,尽管a
和b
是完全不同的值,但它们显示相同的值;终端将字节解释为UTF-8
因此,您可能想知道我们是否可以将unicode字符序列a
转换为可以在空闲状态下显示的字节序列
>>> c = a.encode('cp1252')
Traceback (most recent call last):
File "<pyshell#19>", line 1, in -toplevel-
c = a.encode('cp1252') #uses default encoding
File "C:\Python24\lib\encodings\cp1252.py", line 18, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode characters in position 20-21: character maps to <undefined>
>c=a.encode('cp1252')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在顶层-
c=a.encode('cp1252')#使用默认编码
文件“C:\Python24\lib\encodings\cp1252.py”,第18行,在encode中
返回编解码器.charmap\u encode(输入、错误、编码\u映射)
UnicodeEncodeError:“charmap”编解码器无法对位置20-21中的字符进行编码:字符映射到
答案是否定的;不支持将汉字编码为字节。您能澄清一下您使用的是python 2.x还是3.x吗。虽然(目前)基于u字串前缀很明显,但这是这个问题的重要信息,将来u字首将被添加回python3(pep414)中。我最近看到了这方面的排练。一旦pycon完成,您应该观看它的视频/幻灯片。@Daenyth:很酷,很快(3月10日上午11:45–下午12:15)。不幸的是,Windows下的控制台(命令提示符)对于测试Unicode I/O来说是一个彻底的失败。详细描述您在尝试打印Unicode字符串时遇到的所有中断是一个漫长的过程。这不是Python特有的问题,但它使理解Unicode的实验成为一个困难的命题。您可以在Linux终端或web界面上进行练习,这样可以可靠地执行Unicode。@Aki:视频现在开始:您可以打印一个字符串,因为python的打印检测到它是UTF-8字符串,并将其转换为cp1252?而它只是将b转换为cp1252编码字符串?不,我可以打印
a
,因为a
是一个(16位)unicode字符序列。但是b
是一个字节序列,因此python需要将其转换为字符,并使用平台默认编码进行转换,IDLE的cp1252My版本使用UTF-8。不幸的是,我也无法复制测试,因为它正在对输入应用某种编码。@MarkRansom注意,我无法将图示符剪切并粘贴到空闲状态,但我必须使用转义版本。看看我第二次(成功)分配给a
这是一次非常有见地的任务,你会碰巧知道我的前两个问题吗?我对细节很感兴趣!