python是个什么东西---python---python string和PyQt的QString的区别
?
python string和PyQt的QString的区别 以下在Python2.6和PyQt4.4.4 for Python2,6环境下讨论: Python中有两种有关字符的类型:Python string object和Python Unicode object。主要使用Python string object进行数据输入输出。 PyQt中与之相对应的字符有关类
?
?
python string和PyQt的QString的区别
?
以下在Python2.6和PyQt4.4.4 for Python2,6环境下讨论:
Python中有两种有关字符的类型:Python string object和Python Unicode object。主要使用Python string object进行数据输入输出。
PyQt中与之相对应的字符有关类型是:QByteArray和QString。主要使用QString操作数据。
?
?
1. Python和PyQt中的类型对应
?
?
注意是类型相似,不是相等。
需要先了解编码:ascii、gb2312、big5,这些是各国自己文字不同的编码;unicode,国际通用编码,就是穷尽这个世界上所有的文字,给每个文字编一个,又分utf-8方案--最常使用的128个英文字母用一个字节来表示,而中文使用三个字节来表示,utf-16方案--其中英文和中文都使用两个字节来表示,而其它字符采用四个字节,utf-32方案--所有的文字都用四个字节来表示。
unicode就可用来作为各种独立编码如ascii、gb2312、big5的转换中介。
Python中gkb == gb2312。
1)Python string object可以理解为一个接一个字节(byte,8位)的字节组,至于表示什么编码,与表示文字有关,如:"python string","中文"。注意它是有不同编码区分的!
PyQt中与之相当的是QByteArray,注意不是QString!
?
A built-in string object (plain or Unicode) is a sequence of characters used to store and represent text-based information (plain strings are also sometimes used to store and represent arbitrary sequences of binary bytes). (摘自《Python in a NutShell》)
?
QByteArray can be used to store both raw bytes (including '"0's) and traditional 8-bit '"0'-terminated.(摘自《PyQt手册》)
?
2)Python Unicode object可以理解为固定使用utf-16编码的字节组,其中英文和中文都使用两个字节(16位)来表示,如:u"Python Unicode object"、u"中文"。
PyQt中与之对应的就是QString了。
?
Unicode string literals have the same syntax as other string literals, with a u or U immediately before the leading quote. (摘自《Python in a NutShell》)
?
Qt also provides the QString class to store string data. It stores 16-bit Unicode characters, making it easy to store non-ASCII/non-Latin-1 characters in your application.(摘自《PyQt手册》)
QString stores a string of 16-bit QChars, where each QChar corresponds one Unicode 4.0 character.(摘自《PyQt手册》)
?
2. PyQt内部类型转换
?
?
QString有 toAscii()、toUtf8()函数转换为QByteArray类型,(这个基本不用,因为很少直接用QByteArray类型)有__init__ (self, QByteArray a)函数将QByteArray类型转为QString。
?
3. Python string object和Python Unicode object相互转换
?
?
1)Python string object是原始编码是有区分的,通过 decode('原始编码') 函数解码得到通用utf16编码即Python Unicode object。
>>>"python string".decode('ascii')
或者
>>>"python string".decode()
得到 u"python string"
因为默认按ascii解码。
>>>"中文".decode('gbk')
得到 u""u4e2d"u6587" ,打印出来就是 中文 二字。(注意结果是2字节一组,共两组,对应两个汉字)
又:"python string".decode('gkb') ,即按汉字来解码,也可以得到 u"python string",因为gbk编码也支持英文字母;
但是"中文".decode('ascii') 即按ascii解码是错误的,因为ascii编码不支持汉字!
?
>>> "dfdf".decode()
u'dfdf'
>>> "dfdf".decode("ascii")
u'dfdf'
>>> "dfdf".decode("gbk")
u'dfdf'
>>> "中文".decode("gbk")
u'"u4e2d"u6587'
>>>print "中文".decode("gbk")
中文
>>> "中文".decode("gb2312")
u'"u4e2d"u6587'
>>> "中文".decode("ascii")
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd6 in position 0: ordinal not in range(128)
?
2)Python Unicode object原始编码固定是utf16,通过 encode('目的编码') 编码来得到Python string object。
>>>u"unicode string".encode()
或者
>>>u"unicode string".encode('ascii')
得到
'unicode string',默认目的编码为ascii。
>>>u"中文".encode("gbk")
得到'"xd4"xd0"xce"xc4',打印出来就是 中文。(注意结果是1字节一组,共4组)
?
>>> u"sdff".encode()
'sdff'
>>> u"sdff".encode('ascii')
'sdff'
>>> u"sdff".encode('gbk')
'sdff'
>>> u"sdff".encode('gb2312')
'sdff'
>>> u"中文".encode('gbk')
'"xd6"xd0"xce"xc4'
>>> print u"中文".encode('gbk')
中文
>>> u"中文".encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordin
al not in range(128)
注意:执行>>> u"中文".encode('gbk')命令需要你的IDE支持gbk编码,在官方shell下执行肯定没问题,但如果你的IDE比如PyWin中文输入异常,则可能报错。
?
4. Python string object和Python Unicode object向QString的转换。
?
?
Qt一般不直接操作QByteArray,只需关注Python string object和Python Unicode object向QString的转换。
很多关于PyQt4的英文书籍说:PyQt函数需要QString参数的地方都可以直接用Python string object或者Python Unicode object,如果非要转换可以直接用QtCore.QString()构造。比如《GUI Programming with PyQt》,再如《PyQt手册》:
?
Whenever PyQt expects a QString as a function argument, a Python string object or a Python Unicode object can be provided instead, and PyQt will do the necessary conversion automatically.
?
You may also manually convert Python string and Unicode objects to QString instances by using the QString constructor as demonstrated in the following code fragment:
?
qs1 = QtCore.QString("Converted Python string object")
qs2 = QtCore.QString(u"Converted Python Unicode object")
?
但可惜这只适用于英文即ascii编码,对于中文则行不通!
?
直接的QString:
>>> QtCore.QString('中文')
PyQt4.QtCore.QString(u'"xd6"xd0"xce"xc4')
>>> print QtCore.QString('中文')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordin
al not in range(128)
>>>
>>> QtCore.QString(u'中文')
PyQt4.QtCore.QString(u'"u4e2d"u6587')
>>> print QtCore.QString(u'中文')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordin
al not in range(128)
>>>
因为它们都是默认按ascii编码转换!
?
GUI编程:
可以创建一个QTextEdit对象myTextEdit, 检验:
myTextEdit.append("中文")
或者
myTextEdit.append(u"中文")
或者
myTextEdit.append(QtCore.QString('中文'))
或者
myTextEdit.append(QtCore.QString(u'中文'))
你会发现显示都是乱码...因为它们都是默认按ascii编码进行内部转换得到QString相应utf16编码的。
?
解决方法是:
利用unicode()函数显示指定gb2312编码进行中文编码转换,转换后的Python Unicode object则是可以直接作为QString参数代入用的:
?
>>> unicode('中文', 'gb2312', 'ignore')
u'"u4e2d"u6587'
>>> print unicode('中文', 'gb2312', 'ignore')
中文
>>>
?
myTextEdit.append(unicode('中文', 'gb2312', 'ignore'))
#用以替代myTextEdit.append(u"中文")
或者多此一举下:
myTextEdit.append(QtCore.QString(unicode('中文', 'gb2312', 'ignore')))
#用以替代myTextEdit.append(QtCore.QString(u'中文'))
?
5. QString向Python string object和Python Unicode object的转换。
?
?
Python中需要用Python string object和Python Unicode object的地方可就不一定可以直接用QString了!!!
QString向Python string object转换可以理解,因为编码不同。
QString向Python Unicode object的转换?需要转换吗?不都是utf16编码吗?
QString是tuf16编码,但是它的实现并非Python Unicode object那样直接的utf16码,而实际是一个QChar串,每个QChar才对应unicode符,所以地位相当但并不相同。
许多英文书籍写到:可以使用str()函数直接将QString转换为Python string object,可以使用unicode()直接将QString转换为Python Unicode object。如《PyQt手册》:
?
In order to convert a QString to a Python string object use the Python str() builtin. Applying str() to a null QString and an empty QString both result in an empty Python string object.
?
In order to convert a QString to a Python Unicode object use the Python unicode() builtin. Applying unicode() to a null QString and an empty QString both result in an empty Python Unicode object.
?
但同样只适用于英文,具体见下面分别分析。
1)QString向Python Unicode object的转换。
>>> from PyQt4 import QtGui, QtCore
>>> unicode(QtCore.QString('def'))
u'def'
>>> print unicode(QtCore.QString('def'))
def
?
对于中文,unicode()必须要指定编码后有效。(这样也只针对直接的QString有效?对于Qt GUI编程中,从QWidget取得的QString无效?)
?
>>> from PyQt4 import QtGui, QtCore
>>> unicode(QtCore.QString('中文'))
u'"xd6"xd0"xce"xc4'
>>> print unicode(QtCore.QString('中文'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'gbk' codec can't encode character u'"xd6' in position 0: il
legal multibyte sequence
?
指定原始编码后:
>>> unicode(QtCore.QString('中文'),'gbk','ignore')
u'"u4e2d"u6587'
>>> print unicode(QtCore.QString('中文'),'gbk','ignore')
中文 TEST
?
?
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/angelipin/archive/2009/09/10/4537335.aspx