You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 12:02:09