python - 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
。我想让我的脚本打印出与其他程序中相同的波兰字母结果。你知道怎么做吗?是什么导致了波兰语字符的不同?
解决方案
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 中(上面的示例代码是一个很好的动机)。
推荐阅读
- regex - 正则表达式替换 Jenkinsfile (声明性)中的模式,该模式中有一个 `&`
- c# - 找不到 testhost.dll。请发布您的测试项目并重试
- c# - C# WPF Caliburn Micro 通过 DisplayRootViewFor 抛出 System.Reflection.AmbiguousMatchException
- c - Windows C 编程 ReadFile CHAR 或 WCHAR
- javascript - 当 heatMap boxOnClick 时从 dataTable 中过滤掉带有 0 的行
- javascript - 获取捕获错误的属性列表
- c# - 无法从 Linq.JToken 转换为模型
- imagej - 如何在 ImageJ 结果表中选择行?
- python - 我正在尝试计算字典中的平均分数,但相反,它将每个学生的平均值返回为零
- azerothcore - 行走NPC的文字存放在哪里?