Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python2.X:为什么可以';我不能正确处理Unicode吗?_Python_Unicode_Pyqt4_Python 2.x - Fatal编程技术网

Python2.X:为什么可以';我不能正确处理Unicode吗?

Python2.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

我已经用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')
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字符串之间有什么区别

首先,我建议您阅读Joel Spolesky的优秀文章。这不是关于Python的,但应该有助于您理解正在发生的事情

unicode字符串和普通字符串之间的区别在Python3中变得更加清晰,但在Python2中却是如此。unicode字符串包含字符串的unicode表示形式,普通字符串是包含该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
这是一次非常有见地的任务,你会碰巧知道我的前两个问题吗?我对细节很感兴趣!