Python读取TXT文件异常:凯撒加密后出现乱码问题
凯撒密码加密后字符读取异常的问题分析与解决
问题本质
你遇到的核心问题是读写文件时编码不一致:加密写入文件用了UTF-8编码,但解密读取时没指定编码,Python自动用了系统默认编码(Windows下通常是cp1252),导致UTF-8字节被错误解码。
比如你提到的Unicode索引128的字符,在UTF-8中是两个字节0xC2 0x80,用cp1252解码时,0xC2对应Â,0x80对应€,所以就出现了€的错误显示;后续解密时基于错误字符计算,自然就输出了º₤这类乱码。
修复方案
1. 修正解密代码的读取编码
必须保证读取加密文件时的编码和写入时一致,都用UTF-8:
def decrypt(): newchar = [] # 用with语句自动管理文件,避免手动关闭的问题 with open("encryptedcode2.txt","w", encoding = "utf-8") as out_file: # 读取加密文件时指定utf-8编码 with open("C:/Users/chris/OneDrive/Homework Files/DT/encryptedcode.txt", encoding="utf-8") as c: chars = c.read() for x in chars: x = ord(x)-8 x = chr(x) newchar.append(x) # 合并列表后写入,比逐个write更高效 decrypted_content = ''.join(newchar) out_file.write(decrypted_content) print(decrypted_content) decrypt()
2. 加密代码的优化建议
同样用with语句管理文件,同时读取原文件时也指定编码,避免系统编码差异带来的隐患:
def encrypt(file_path: str, key: int): with open(file_path, encoding="utf-8") as d: data = d.read() # 用列表推导式简化字符转换逻辑 encrypted_chars = [chr(ord(c) + key) for c in data] with open("encryptedcode.txt","w", encoding = "utf-8") as f: f.write(''.join(encrypted_chars)) encrypt("C:/Users/chris/OneDrive/Homework Files/DT/advstrings.py", 8)
额外说明
- 凯撒密码处理Unicode字符时,只要保持读写编码完全一致,就不会出现解码错误;即使偏移后出现不可打印的Unicode字符,也能正确还原。
- 你之前解密输出的
º₤,就是错误解码后的字符再做偏移计算导致的,修复编码后就能还原成原本的x。
内容的提问来源于stack exchange,提问作者RedZ
相关产品推荐
相关产品推荐

