当前位置:百问九>百科词库>Python String和PyQt QString的区别

Python String和PyQt QString的区别

2023-05-23 00:29:11 编辑:zane 浏览量:588

Python String和PyQt QString的区别

以下在python2.5和PyQt4.4.6 for python2.5环境下讨论。 在python中有两种与字符有关的类型:string object和Unicode object。平时进行输入输出的一般都用stringobject,当需要显示一些特殊字符或者中文等文字时候,需要转换为Unicode编码。在PyQt中也有两种字符类型与上面两者对应:QByteArray和QString,主要是使用QString操作数据。1) python stringobject可以理解为一个接一个字节的字节组,至于表示什么编码,与饥孝弊表示文字有关,比如“pythonstring”,“中文”。注意它是有不同编码区分的。PyQt中与之对应的是QbyteArray,而不是Qstring。A built-in string object (plain or Unicode) is a sequence ofcharacters used to store and represent text-based information(plain strings are also sometimes used to store and representarbitrary sequences of binary bytes). (摘自《Python in aNutShell》)QByteArray can be used to store both raw bytes (including '"0's)and traditional 8-bit '"0'-terminated.(摘自《PyQt手册》)2)Python Unicodeobject可以理解为固定使用utf-16编码的字节组,其中英文和中文都使用两个字节(16位)来表示,如:u"PythonUnicode object"、u"中文"。PyQt中与之对应的就是QString了。Unicode string literals have the same syntax as other stringliterals, 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 stores16-bit Unicode characters, making it easy to storenon-ASCII/non-Latin-1 characters in yourapplication.(摘自《PyQt手册》)QString stores a string of 16-bit QChars, where each QCharcorresponds 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。>>>"pythonstring".decode('ascii')或者>>>"pythonstring".decode()得到 u"python string"因为默认按ascii解码。>>>"中文".decode('gbk')得到 u""u4e2d"u6587" ,打印出来就是 中文 二字。(注意结果是2字节一组,共两组,对应两个汉字)又:"python string".decode('gkb') ,即按汉字来解码,也可以得到 u"pythonstring",因为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 "", line 1,in UnicodeDecodeError: 'ascii' codec can't decode byte 0xd6 inposition 0: ordinal not in range(128)2)Python Unicode object原始编码固定是utf16,通过 encode('目的编码') 编码来得到Pythonstring object。>>>u"unicodestring".encode()或者>>>u"unicodestring".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'>>> printu"中文".encode('gbk')中文>>>u"中文".encode('ascii')Traceback (most recent call last):File "", line 1, inUnicodeEncodeError: 'ascii' codec can't encode characters inposition 0-1: ordinal 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 Unicodeobject向QString的转换。很多关于PyQt4的英文书籍说:PyQt函数需要QString参数的地方都可以直接用Python stringobject或者Python Unicode object,如果非要转换可以直接用QtCore.QString()构造。比如《GUIProgramming with PyQt》,再如《PyQt手册》:Whenever PyQt expects a QString as a function argument, a Pythonstring 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 toQString instances by using the QString constructor as demonstratedin 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')>>> printQtCore.QString('中文')Traceback (most recent call last):File "", line 1, inUnicodeEncodeError: 'ascii' codec can't encode characters inposition 0-3: ordinal not in range(128)>>>>>>QtCore.QString(u'中文')PyQt4.QtCore.QString(u'"u4e2d"u6587')>>> printQtCore.QString(u'中文')Traceback (most recent call last):File "", line 1, inUnicodeEncodeError: 'ascii' codec can't encode characters inposition 0-1: ordinal 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 Unicodeobject则是可以直接作为QString参数代入用的:>>> unicode('中文','gb2312', 'ignore')u'"u4e2d"u6587'>>> printunicode('中文', '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 Unicodeobject的地方可就不一定可以直接用QString了!!!QString向Python string object转换可以理解,因为编码不同。QString向Python Unicode object的转换?需要转换吗?不都是utf16编码吗?QString是tuf16编码,但是它的实现并非Python Unicodeobject那样直接的utf16码,而实际是一个QChar串,每个QChar才对应unicode符,所以地位相当但并不相同。许多英文书籍写到:可以使用str()函数直接将QString转换为Python stringobject,可以使用unicode()直接将QString转换为Python Unicodeobject。如《PyQt手册》:In order to convert a QString to a Python string object use thePython str() builtin. Applying str() to a null QString and an emptyQString both result in an empty Python string object.In order to convert a QString to a Python Unicode object use thePython unicode() builtin. Applying unicode() to a null QString andan empty QString both result in an empty Python Unicodeobject.但同样只适用于英文,具体见下面分别分析。1)QString向Python Unicode object的转换。>>> from PyQt4 importQtGui, QtCore>>>unicode(QtCore.QString('def'))u'def'>>> printunicode(QtCore.QString('def'))def对于中文,unicode()必须要指定编码后有效。(这样也只针对直接的QString有效?对于QtGUI编程中,从QWidget取得的QString无效?)>>> from PyQt4 importQtGui, QtCore>>>unicode(QtCore.QString('中文'))u'"xd6"xd0"xce"xc4'>>> printunicode(QtCore.QString('中文'))Traceback (most recent call last):File "", line 1, inUnicodeEncodeError: 'gbk' codec can't encode character u'"xd6' inposition 0: illegal multibyte sequence指定原始编码后:>>>unicode(QtCore.QString('中文'),'gbk','ignore')u'"u4e2d"u6587'>>> printunicode(QtCore.QString('中文'),'gbk','ignore')中文 TEST

版权声明:文章由 百问九 整理收集,来源于互联网或者用户投稿,如有侵权,请联系我们,我们会立即处理。如转载请保留本文链接:https://www.baiwen9.com/tips/197124.html
热门文章
二维码