首页 > 解决方案 > Python - 特殊字符的不同CRC结果

问题描述

我正在学习 Python 3,但找不到以下问题的任何解释。我正在使用此代码从字节串计算 JAMCRC:

import zlib

x = b'a'
result = int('0b'+'1'*32,2) - zlib.crc32(x)
print(result)

对于 'a' 它打印390611388. 我正在将上述脚本计算的 JAMCRC 结果与第三方程序(Windows .exe,可能用 .NET 或 C# 编写)进行比较。对于标准 ASCII 字符和字符串,来自两个程序(以上脚本和第三方程序)的结果是相同的。问题是当我尝试从波兰字母计算 JAMCRC 时,这些程序的结果是不同的。例如,当我设置x为 'ó' 时,我的脚本会打印211389371,但其他用于 'ó' 的程序会打印155825108。我想让我的脚本打印出与其他程序中相同的波兰字母结果。你知道怎么做吗?是什么导致了波兰语字符的不同?

标签: pythonstringunicodecrc32

解决方案


Python 默认使用 Unicode,特别是 UTF-8。然而,Windows 显然默认为 ISO 8859 编码。使用此编码方案会产生相同的 CRC:

In [1]: x = 'ó'.encode('utf8')

In [2]: print(int('0b'+'1'*32,2) - zlib.crc32(x))
211389371

In [3]: x = 'ó'.encode('8859')

In [4]: print(int('0b'+'1'*32,2) - zlib.crc32(x))
155825108

编辑:以上在 Python 3.7 中对我有用。有关所有可用编码列表的链接,请参阅下面的 @daxim 评论。此代码在 Python 2 中无法按原样工作,因为 Python 2 字符串以 ASCII/latin-1 编码,而 Python 3 字符串以 Unicode 编码。如果您需要的话,您需要专门查找如何在 Python 2 中处理 unicode 字符串。我要提醒一下, Python 2 将从 2020 年开始报废;它已经出现多年了,如果你正在编写新代码,它真的应该在 Python 3 中(上面的示例代码是一个很好的动机)。


推荐阅读