首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

python是个什么东西-python-python string跟PyQt的QString的区别

2012-08-30 
python是个什么东西---python---python string和PyQt的QString的区别?python string和PyQt的QString的区别

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

热点排行