2016-04-02 16 views
1

Ich habe einen Code, so konvertieren 0x8A5E in utf16 respectively), das Ergebnis war:Wie CJK Extention B in QLineEdit von Python3-PyQt4 auf utf-8 bis zur Verarbeitung mit regex

\u654f\u611f\u8a5e 
OK 

aber wenn I input "詞" (0x8A5E, 0xD840 0xDC37, 0xD840 0xDC81, 0xD840 0xDC4D in utf16), in dem es gab 3 Zeichen von CJK Extention B Bereich. Das Ergebnis, das ist nicht zu erwarten ist:

\u8a5e\ud840\udc37\ud840\udc81\ud840\udc4d 
error 

wie kann ich mit der Umstellung auf utf-8 diese CJK-Zeichen verarbeitet, um suitabliy mit Wieder von Python3 verarbeitet werden?

P.S.

  1. der Wert von sys.maxunicode ist 1.114.111, könnte es UCS-4 sein. Daher denke ich, dass die Frage der gleiche wie python regex fails to match a specific Unicode > 2 hex values

  2. ein anderer Code nicht zu sein scheint:

    #!/usr/bin/env python3 
    #-*-coding:utf-8-*- 
    import re 
    CJKBlock = re.compile("^[一-鿌㐀-䶵\U00020000-\U0002A6D6]+$") #CJK ext B 
    print(CJKBlock.search('詞')) 
    

kehrt <_sre.SRE_Match object; span=(0, 4), match='詞'> #expected Ergebnis.

  1. Ich habe sogar self.lineEdit.setText("詞") innerhalb __init__ Funktion der Fensterklasse und ausgeführt es zeigt das Wort in LineEdit angemessen, aber wenn ich Eingabe gedrückt, war das Ergebnis immer noch „Fehler“

  2. Version:

    • Python3.4.3
    • Qt-Version: 4.8.6
    • PyQt Version: 4.10.4.
+0

Warum verwenden Sie einen Narrow-Build von Python-3.4? Seit [PEP-0393] (http://www.python.org/dev/peps/pep-0393/) ist das kein Vorteil mehr.Ihr Code schlägt fehl, da die Nicht-BMP-Zeichen als Ersatzpaare dargestellt werden müssen. Wenn Sie zu einem Wide-Build von Python-3.4 wechseln, wird dieses Problem verschwinden. – ekhumoro

+0

Re. @ekhumoro der zurückgegebene Wert von sys.maxunicode ist 1114111, möglicherweise in UCS-4. –

+0

#!/Usr/bin/env python3 # - * - Codierung: utf-8 - * - Import re; CJKBlock = re.compile ("^ [一 -鿌 㐀 - 䶵 \ U00020000- \ U0002A6D6] + $"); #CJK ext B drucken (CJKBlock.search ('詞')); gibt das Objekt <_sre.SRE_Match zurück; span = (0, 4), Übereinstimmung = '詞'> # erwartetes Ergebnis. aber die Zeichenfolge von QLineEdit schlägt das nicht vor. Vielleicht ist es das Problem von Python3-PyQt4? –

Antwort

0

Es gab ein paar PyQt4 Bugs im Anschluss an die Umsetzung und Durchsetzung von PEP-393, die Konvertierungen zwischen QString und Python Strings beeinflussen können. Wenn Sie sip verwenden, um zur API v1 zu wechseln, sollten Sie wahrscheinlich bestätigen können, dass die QString, die von der Zeile-edit zurückgegeben wird, keine Ersatzpaare enthält. Aber wenn Sie es dann in eine Python-Zeichenfolge konvertieren, sollten die Surrogate erscheinen.

Hier ist, wie dies zu testen in einer interaktiven Sitzung:

>>> import sip 
>>> sip.setapi('QString', 1) 
>>> from PyQt4 import QtGui 
>>> app = QtGui.QApplication([]) 
>>> w = QtGui.QLineEdit() 
>>> w.setText('詞') 
>>> qstr = w.text() 
>>> qstr 
PyQt4.QtCore.QString('詞') 
>>> pystr = str(qstr) 
>>> print('\\u' + '\\u'.join('{:x}'.format(ord(c)) for c in pystr)) 
\u8a5e\u20037\u20081\u2004d 

Natürlich sind diese letzte Zeile zeigt nicht Surrogate für mich, weil ich nicht den Test mit PyQt-4.10.4 tun können. Ich habe jedoch mit PyQt-4.11.1 und PyQt-4.11.4 getestet, und ich habe keine Probleme gesehen. Du solltest also versuchen, auf eins von diesen zu aktualisieren.

+0

Als ich auf python3-pyqt4 4.11.4 und python3-sip 4.16.9 aktualisieren, wurde die Frage gelöst. Vielen Dank. –