[PyQt] QApplication constructor mangles non-ascii characters in unicode strings

Phil Thompson phil at riverbankcomputing.com
Fri Jan 30 16:50:40 GMT 2015


On 12/01/2015 8:59 pm, Pavel Roskin wrote:
> Hello!
> 
> I'm porting a PyQt based application to Python 3. If I initialize
> QApplication with sys.argv, QApplication.arguments() returns those
> arguments with non-ascii characters stripped out in PyQt4 or replaced
> with "replacement character" in PyQt5. The end result is that files
> with non-ascii (but valid UTF-8) names cannot be opened. A workaround
> that I don't quite like is to encode the arguments and pass them as
> bytes.
> 
> I made this simple test case to show the problem. The test case runs
> in both Python 2 and Python 3. Comment out the other import to use
> PyQt4 instead of PyQt5.
> 
> #! /usr/bin/python
> #from PyQt4.QtGui import QApplication
> from PyQt5.QtWidgets import QApplication
> args = [u"test", u"tsch\u00fcss", u"tsch\u00fcss".encode("utf-8")]
> print("args:", args)
> qapp = QApplication(args)
> qargs = qapp.arguments()
> for qarg in qargs:
>     print("qarg:", qarg)
> 
> Output under Python 2 and PyQt5
> 
> ('args:', [u'test', u'tsch\xfcss', 'tsch\xc3\xbcss'])
> ('qarg:', u'test')
> ('qarg:', u'tsch\ufffdss')
> ('qarg:', u'tsch\xfcss')
> 
> \ufffd is a the unicode replacement character. It cannot be traced
> back to u umlaut. \xfc is u umlaut. So the unicode argument got
> mangled, whereas the encoded argument was decoded back to correct
> unicode.
> 
> I just want to pass sys.argv to the QApplication constructor without
> any extra manipulations, with any Python version.
> 
> I'm using Ubuntu 14.10 with the following packages:
> 
> python-qt4 4.11.2+dfsg-1
> python-pyqt5 5.3.2+dfsg-1ubuntu1
> python3-pyqt4 4.11.2+dfsg-1
> python3-pyqt5 5.3.2+dfsg-1ubuntu1
> python 2.7.8-1
> python3 3.4.2-1

Should be fixed in tonight's snapshots.

Thanks,
Phil


More information about the PyQt mailing list