如何将 Python3-PyQt4 的 QLineEdit 中的 CJK 扩展 B 转换为 utf-8 以使用正则表达式对其进行处理

How to convert CJK Extention B in QLineEdit of Python3-PyQt4 to utf-8 to Processing it with regex

我有这样的代码:

#!/usr/bin/env python3
#-*-coding:utf-8-*-
from PyQt4 import QtGui, QtCore
import re
.....
str = self.lineEdit.text() # lineEdit is a object in QtGui.QLineEdit class

# This line thanks to Fedor Gogolev et al from 
#

print('\u'+"\u".join("{:x}".format(ord(c)) for c in str))
# u+20000-u+2a6d6 is CJK Ext B
cjk = re.compile("^[一-鿌㐀-䶵\U00020000-\U0002A6D6]+$",re.UNICODE) 

if cjk.match(str):
    print("OK")
else:
    print("error")

当我输入“敏感词”(utf16分别为0x654F,0x611F,0x8A5E)时,结果为:

\u654f\u611f\u8a5e
OK

但是当我输入“词”(utf-16中的0x8A5E,0xD840 0xDC37,0xD840 0xDC81,0xD840 0xDC4D)时,其中有3个来自CJK扩展B区的字符。出乎意料的结果是:

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

如何处理这些 CJK 字符并转换为 utf-8 以便用 Python3 的 re 适当处理?

P.S.

  1. sys.maxunicode的值是1114111,可能是UCS-4。因此,我认为这个问题似乎与 python regex fails to match a specific Unicode > 2 hex values

  2. 另一个代码:

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

returns <_sre.SRE_Match object; span=(0, 4), match='詞'> #预期结果。

  1. 即使我在 window class 的 __init__ 函数中添加了 self.lineEdit.setText("詞") 并执行了它,LineEdit 中的单词显示正确,但是当我按回车,结果还是"error"

  2. 版本:

    • Python3.4.3
    • Qt 版本:4.8.6
    • PyQt 版本:4.10.4.

在 PEP-393 实施后出现了一些 PyQt4 错误,这些错误可能会影响 QString 和 python 字符串之间的转换。如果您使用 sip 切换到 v1 API,您应该能够确认行编辑 返回的 QString 包含代理项对.但是,如果您随后将其转换为 python 字符串,则应该会出现代理项。

以下是如何在交互式会话中对此进行测试:

>>> 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

当然,这最后一行没有为我显示代理项,因为我无法使用 PyQt-4.10.4 进行测试。不过,我已经使用 PyQt-4.11.1 和 PyQt-4.11.4 进行了测试,但没有发现任何问题。所以你应该尝试升级到其中之一。