Python 2.7遍历含非ASCII字符词表时ASCII编解码器错误求助
问题分析与解决方法
为什么Python 2.7默认用ASCII编码?
Python 2.7的字符串体系区分str(字节串)和unicode(文本串)。即便系统环境变量LANG是UTF-8,Python 2.7在隐式进行字节串与文本串转换时,默认编码仍为ASCII。比如将unicode对象和str对象拼接、或对str调用decode()却不指定编码时,都会默认用ASCII解码,遇到非ASCII字节就会触发UnicodeDecodeError。你的报错正是因为代码中存在这种隐式转换——比如secret(可能是unicode类型)和后续padding字节串拼接时,Python尝试用ASCII解码字节串,最终失败。
Python 2.7下的解决办法
- 统一字符串类型:加密操作需确保所有输入都是字节串(
str类型),避免混合unicode和str:- 读取词表时,直接解码为
unicode再转成字节串:import codecs with codecs.open('wordlist.txt', 'r', 'utf-8') as f: words = [word.strip().encode('utf-8') for word in f] - 修改加密初始化代码,先把
secret转成字节串再处理padding:secret_bytes = secret.encode('utf-8') # 若secret是unicode类型 padding_length = (BLOCK_SIZE - len(secret_bytes) % BLOCK_SIZE) cipher = AES.new(secret_bytes + padding_length * PADDING, AES.MODE_ECB)
- 读取词表时,直接解码为
- 显式指定编码:所有编码/解码操作都明确写
utf-8,绝不依赖默认行为。
Python 3下的Crypto模块问题解决
Python 3原生没有Crypto模块,需安装替代库pycryptodome:
pip install pycryptodome
安装后正常导入即可:
from Crypto.Cipher import AES
内容的提问来源于stack exchange,提问作者nalthea
相关产品推荐
相关产品推荐

