2011-01-07 68 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轉:

éé

éé

éé

希望這會有所幫助,至於