2015-01-09 89 views
2

我試圖將一個基於PyQt的應用程序移植到Python 3.如果我用sys.argv初始化QApplication,QApplication.arguments()會返回那些沒有非-ascii字符。解決方法是將參數作爲字節進行編碼。但我很難相信這是最好的方法。爲什麼PyQt不能接受unicode字符串?也許一些區域設置需要調整?python3-qt4在QApplication構造器中丟棄unicode字符串中的非ASCII字符

示例代碼:

#! /usr/bin/python3 

from PyQt4.QtGui import QApplication 

args = ["test", "tsch\u00fcss", "tsch\u00fcss".encode("utf-8")] 
print("args:", args) 
qapp = QApplication(args) 
qargs = qapp.arguments() 
print("qargs:", qargs) 

輸出:

args: ['test', 'tschüss', b'tsch\xc3\xbcss'] 
qargs: ['test', 'tschss', 'tschüss'] 

東西,讓沒有區別:

import sip 
sip.setapi("QString", 2) 

import locale 
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') 

Ubuntu的14.10,python3-PyQt4的4.11.2 + DFSG-1

回答

2

這看起來像一個錯誤我PyQt,由PySide正確處理。

而且似乎沒有理由ARGS不能正確地傳遞給應用程序構造函數之前編碼:

>>> import os 
>>> from PyQt4 import QtCore 
>>> args = ['føø', 'bær'] 
>>> app = QtCore.QCoreApplication([os.fsencode(arg) for arg in args]) 
>>> app.arguments() 
['føø', 'bær'] 

如果你想看到這個拿不動,請在PyQt Mailing List報告。

+0

我剛剛報告了這個錯誤。至於PySide,它並不好。在Python 3中,字節參數被完全丟棄。在Python 2中,unicode參數會導致解釋器崩潰。 – proski 2015-01-12 21:18:28

+0

'os.fsencode'在Python 2中不可用。我希望代碼在沒有條件的情況下在Python 2和3中工作。 – proski 2015-01-12 21:27:07

+1

@proski。使用PySide-1.2.2和Python 3與unicode工作正常。這不是unicode不適用於Python 2(無論是PySide還是PyQt4)的錯誤,因爲字節應始終是唯一有效的輸入。出於同樣的原因,Python 2中缺少'os.fsencode'是無關緊要的。如果你想要Python 2和Python 3之間的兼容性,你將不得不自己處理這個問題。這裏唯一的錯誤是PyQt不能正確處理Python 3的unicode字符串。 – ekhumoro 2015-01-13 00:46:46