Python-特殊字符产生的不同CRC结果

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

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

import zlib

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

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

python string unicode crc32
1个回答
2
投票
Python defaults to using Unicode,特别是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中为我工作。有关所有可用编码列表的链接,请参见下面的@daxim评论。 

此代码在Python 2中无法按原样工作,因为Python 2字符串以ASCII / latin-1编码,而Python 3字符串以Unicode编码。如果需要的话,您需要专门查找如何在Python 2中处理unicode字符串。 我要说的就是这一点 Python 2将于2020年开始报废;它已经问世多年了,如果您正在编写新代码,那么它确实应该在Python 3中使用(上面的示例代码是一个很好的动力)。

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