如何将 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.
sys.maxunicode的值是1114111,可能是UCS-4。因此,我认为这个问题似乎与
python regex fails to match a specific Unicode > 2 hex values
另一个代码:
#!/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='詞'>
#预期结果。
即使我在 window class 的 __init__
函数中添加了 self.lineEdit.setText("詞")
并执行了它,LineEdit 中的单词显示正确,但是当我按回车,结果还是"error"
版本:
- 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 进行了测试,但没有发现任何问题。所以你应该尝试升级到其中之一。
我有这样的代码:
#!/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.
sys.maxunicode的值是1114111,可能是UCS-4。因此,我认为这个问题似乎与 python regex fails to match a specific Unicode > 2 hex values
另一个代码:
#!/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='詞'>
#预期结果。
即使我在 window class 的
__init__
函数中添加了self.lineEdit.setText("詞")
并执行了它,LineEdit 中的单词显示正确,但是当我按回车,结果还是"error"版本:
- 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 进行了测试,但没有发现任何问题。所以你应该尝试升级到其中之一。