2011-01-07 67 views
3


我没有设法简单地打印一个包含特殊字符的QString变量。
我总是得到一个UnicodeEncodeError:如何使用PyQt打印包含特殊字符的QString?

'ascii' codec can't encode characters in position ....

这里是我尝试没有成功代码:

var1 = "éé" #idem with u"éé" 
var2 = QString (var1) 
print var2 
--->>> UnicodeEncodeError 
print str(var2) 
--->>> UnicodeEncoreError 
var3 = QString.fromLocal8Bit (var1) #idem with fromLatin1 and fromUtf8 
print var3 
--->>> UnicodeEncodeError 

codec = QTextCodec.codecForName ("UTF-8") #idem with ISO 8859-1 
var4 = codec.toUnicode (var2.toUtf8().data()) #idem with toLatin1 instead of toUtf8 
print var4 
--->>> UnicodeEncodeError 

我还试图用:

QTextCodec.setCodecForCStrings(QTextCodec.codecForName("UTF-8")) 

我真的需要打印QString变量,而不是QByteArray或其他对象。

+0

你在哪里打印到?如果你是例如使用ascii-only终端,你不能显示非ascii字符 - 这与`QString`无关。你能打印var1吗? – delnan 2011-01-07 14:08:10

+0

是的,我可以打印var1。我只是尝试在运行python解释器的cmd提示符内进行打印。我也尝试在Eclipse环境控制台中打印相同的结果。我在Windows和Linux上使用Python 2.5和Python 2.7进行了尝试。 – oaimac 2011-01-07 14:45:25

+0

即使转换str(var2)也给出相同的错误(只有当var1和var2包含特殊字符时) – oaimac 2011-01-07 14:47:48

回答

5

它的工作原理我使用toUtf8()为:

>>> s = u'éé' 
>>> qs = QString(s) 
>>> qs 
PyQt4.QtCore.QString(u'\xe9\xe9') 
>>> print qs 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) 
>>> print qs.toUtf8() 
éé 
>>> 

你的内部数据应该是Unicode,所以你应该使用u'éé'而不仅仅是'éé'正如你在你的问题中说明。你的评论甚至说u'éé'

更新:除非你使用一个特定的编码很抱歉,但打印或str()上的Unicode不能保证对Unicode的工作对象。打印流接受字节数组/字节串,并且Unicode对象上的str()有效地试图将Unicode转换为字节数组/字节串。你不能避免字节数组!

1

尝试以下操作:

  1. 在脚本的乞讨添加# -*- coding: utf-8 -*-魔术评论(详情here
  2. 使用 “U” 字符串声明与字符串常量
下面

就是一个例子它适用于我

# -*- coding: utf-8 -*- 

from PyQt4 import QtCore 

var1 = u"éé" #idem with u"éé" 
print var1 

var2 = QtCore.QString(var1) 
print var2 

var3 = QtCore.QString(u"éé") 
print var3 

re转:

éé

éé

éé

希望这会有所帮助,至于