Pypy 下的 UTF16 编码问题(在 CPython 中工作)

问题描述 投票:0回答:1

在 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 不同的结果。

python pypy
1个回答
0
投票

此差异可能是由于不同平台上

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)

检查它是否适合您并更新。

© www.soinside.com 2019 - 2024. All rights reserved.