它看起来像 PySide6 中的一个错误。返回的对象只有QStringConverter的继承方法,使用dir可以看出:
>>> dec = QtCore.QStringDecoder(QtCore.QStringConverter.Encoding.Utf16)
>>> for x in dir(dec):
... if x[0].islower(): print(x)
...
hasError
isValid
name
nameForEncoding
requiredSpace
resetState
state
所以decode methods 丢失了,TypeError 表示()-operator 重载也丢失了。 QStringEncoder 类也有类似的问题。
在 PyQt6 中,一切都按预期工作:
>>> enc = QtCore.QStringEncoder(QtCore.QStringConverter.Encoding.Utf16)
>>> dec = QtCore.QStringDecoder(QtCore.QStringConverter.Encoding.Utf16)
>>> x = enc('text')
>>> x
PyQt6.QtCore.QByteArray(b't\x00e\x00x\x00t\x00')
>>> dec(x)
'text'
当然,您并不真的需要使用这些 Qt 类,因为 Python 中已经存在等效功能:
>>> x = 'text'.encode('utf-16')
>>> x
b'\xff\xfet\x00e\x00x\x00t\x00'
>>> x.decode('utf-16')
'text'
请注意,Python 会自动添加 BOM,而 Qt 需要 additional flag 才能获得相同的行为。要在 Python 中获取 Qt 风格的可调用对象,您可以使用 functools.partial 或 lambda:
>>> from functools import partial
>>> enc = partial(str.encode, encoding='utf-16')
>>> # or enc = lambda s: s.encode('utf-16')
>>> dec = partial(bytes.decode, encoding='utf-16')
>>> # or dec = lambda b: b.decode('utf-16')
>>> x = enc('text')
b'\xff\xfet\x00e\x00x\x00t\x00'
>>> dec(x)
'text'
注意:要将 QByteArray 转换为 Python bytes 对象,请使用 bytes(qtbytearray) 或 qtbytearray.data()(另请参阅:How to convert a QByteArray to a python string)。