Python Qt QLineEdit 奇怪的编码问题

2 投票
2 回答
3001 浏览
提问于 2025-04-18 15:49

我遇到了一个让我困惑的情况。我在我的界面里有一个文本输入框(QLineEdit),当我在里面输入以下文本时:'(这是亚拉姆语),而且我电脑上安装了正确的字体,所以我在浏览器里可以看到这些字体,但这些字体是我自己安装的,所以你可能会看到一些奇怪的字符。

self.editor = QtGui.QLineEdit(self)
self.editor.setText( '   )

在界面的编辑框里,我能正确看到这些文本,但当我尝试重新提取这些文本时,却得到了奇怪的结果:

editor_text = self.editor.text()

这里我遇到了一个异常:

print(editor_text)
UnicodeEncodeError: 'utf-8' codec can't encode character '\ud802' in position 0:     
surrogates not allowed

pprint(editor_text)
"\ud802\udc40\ud802\udc4c\ud802\udc53 \ud802\udc4a\ud802\udc53' "
'\ud802\udc53\ud802\udc41 '
'\ud802\udc40\ud802\udc41\ud802\udc53\ud802\udc44\ud802\udc4c '
'\ud802\udc4f\ud802\udc4b'

我尝试了以下方法:

editor_text = self.editor.text().encode(encoding='utf-8', errors='surrogateescape')
UnicodeEncodeError: 'utf-8' codec can't encode character '\ud802' in position 0:    
surrogates not allowed

我该怎么做才能解决这个问题,谢谢。

补充:

当然,我已经添加了头文件。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

2 个回答

0

我只需要做的就是

print unicode(testQLineEdit.text())
2
  1. 在源代码的开头加上这个:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    

    你可以看看这个讨论串:PEP索引

  2. 在你的阿拉米语字符字符串中,把上面的Python字符串加上'u',这样就可以用unicode模式了,像这样:

    u' ܐܪܡܝܐ‎ '
    

    或者

    u'Unicode String'
    

完整的代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtCore, QtGui
class exampleQMainWindow (QtGui.QMainWindow):
    def __init__ (self):
        super(exampleQMainWindow, self).__init__()
        testQLineEdit = QtGui.QLineEdit(self)
        testQLineEdit.setText(u'ܐܪܡܝܐ‎')
        print testQLineEdit.text()
        self.setCentralWidget(testQLineEdit)

app = QtGui.QApplication([])
window = exampleQMainWindow()
window.show()
sys.exit(app.exec_())

你可以像这样从其他地方获取变量:

text = u'ܐܪܡܝܐ‎'
testQLineEdit = QtGui.QLineEdit(self)
testQLineEdit.setText(text)
print testQLineEdit.text()

要强制将字符串转换为Unicode,你可以使用 unicode(String)

这是返回文本的测试输出类型:

>> print type(unicode(testQLineEdit.text()))
<type 'unicode'>

>> print type(testQLineEdit.text())
<class 'PyQt4.QtCore.QString'>

>> print type(testQLineEdit.text().toUtf8())
<class 'PyQt4.QtCore.QByteArray'>

所有条件都可以在控制台中打印出来。

撰写回答