Python - 来自特殊字符的不同 CRC 结果

Python - different CRC results from special characters

我正在学习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。我想让我的脚本为波兰语字母打印与其他程序中相同的结果。你知道怎么做吗?是什么导致了波兰语字符的差异?

Python defaults to using Unicode, specifically UTF-8. Windows, however, apparently defaults to ISO 8859 encoding。使用此编码方案会产生相同的 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 中对我有用。有关所有可用编码列表的 link,请参阅下面的 @daxim 评论。 此代码在 Python 2 中无法正常工作,因为 Python 2 字符串在 ASCII/latin-1 中编码,而 Python 3字符串以 Unicode 编码。如果需要,您需要专门查找如何处理 Python 2 中的 unicode 字符串。 我会警告说 Python 2 从 2020 年开始停产;它已经淘汰多年,如果你正在编写新代码,它真的应该在 Python 3 中(上面的示例代码是一个很好的动机)。