在 Windows 上的 CPython3 3.11.5 下:
# b = "ąęćół".encode("utf-16") # this gives the below bytestring
b = b'\xff\xfe\x05\x01\x19\x01\x07\x01\xf3\x00B\x01'
print(b.decode("utf-16")) # => "ąęćół" # OK
在 Windows 上的 Pypy 3.10.13 下:
b = b'\xff\xfe\x05\x01\x19\x01\x07\x01\xf3\x00B\x01'
print(b.decode("utf-16")) # => "─ů─Ö─ç├│┼é" # BAD
print(b.decode("utf-16le")) # => "\ufeff─ů─Ö─ç├│┼é" # BAD
print(b.decode("utf-16be")) # => "\ufffeďüߥü▄ü\uf300ńłü" # BAD
如何解决此解码差异?我实际上使用了一个库,通过在 pypy 下运行,我看到了显着的速度提升,但是我得到了损坏的字符串,我将其范围缩小到
b.decode('utf-16')
调用,该调用给出了与 Windows 下的 cpython 3 不同的结果。
此差异可能是由于不同平台上
utf-16
编码使用的默认字节顺序不同所致。 Python 3 utf-16
使用 BOM(代表字节顺序标记)来确定编码数据的字节顺序。
为了获得一致的结果,您可以尝试:
b.decode('utf-16-le')
您还可以检查编码中是否存在 BOM,例如检查
b'\xff\xfe'
例如:
if b[:2] == b'\xff\xfe':
decod = b[2:].decode('utf-16-le')
elif b[:2] == b'\xfe\xff':
decod = b[2:].decode('utf-16-be')
else:
decod = b.decode('utf-16')
print(decod)
检查它是否适合您并更新。