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

Python字符串UTF-32编解码异常求助:文件读写后字节重复报错

解决UTF-32编码解码的文件读写问题

我来帮你搞定这个问题!你的核心问题出在编码后写入文件的方式错误——你把UTF-32编码后的字节对象转成了字符串(也就是把b'\xff\xfe...'这种文本形式写进了文件),而不是直接写入原始字节。这就导致解码时读取的不是真正的UTF-32字节流,而是字节对象的字符串表示,自然触发解码错误。

问题拆解

看你的encode函数:

def encode(filename):
    s = readfile(filename)
    s_enc = bytes(s, 'utf-32')
    writefile(filename, str(s_enc))  # 这里错了!把bytes的字符串表示写入了文件

str(s_enc)会把字节对象转换成类似b'\xff\xfe\x00\x00H\x00...'的字符串,写入文件后,文件里存的是这段文本,而不是UTF-32的原始字节。后续用readfile_b读取时,得到的是这段文本的字节,自然无法用UTF-32解码。

修正后的代码

我们需要调整文件读写的模式,直接操作字节流,同时用with语句简化文件操作(自动关闭文件,更安全):

def read_text(filename):
    # 读取文本文件(默认utf-8,可根据需要调整)
    with open(filename, 'r', encoding='utf-8') as f:
        return f.read()

def read_bytes(filename):
    # 读取二进制文件
    with open(filename, 'rb') as f:
        return f.read()

def write_text(filename, content):
    # 写入文本文件
    with open(filename, 'w', encoding='utf-8') as f:
        f.write(content)

def write_bytes(filename, content):
    # 写入二进制文件
    with open(filename, 'wb') as f:
        f.write(content)

def encode(filename):
    # 读取原始文本,编码为UTF-32字节,写入二进制文件
    s = read_text(filename)
    s_enc = s.encode('utf-32')  # 等价于bytes(s, 'utf-32'),写法更直观
    write_bytes(filename, s_enc)

def decode(filename):
    # 读取UTF-32字节,解码为文本,写入文本文件
    s_enc = read_bytes(filename)
    s = s_enc.decode('utf-32')
    write_text(filename, s)

# 测试执行
encode("Example.txt")
decode("Example.txt")

关键修改点

  • 编码阶段:用write_bytes(二进制模式wb)直接写入UTF-32编码后的字节,不再转成字符串。
  • 解码阶段:用read_bytes(二进制模式rb)读取原始字节,直接调用decode('utf-32')还原字符串。
  • 用with语句管理文件,避免手动关闭文件可能出现的遗漏或错误。
  • 函数命名更清晰,明确区分文本和字节操作,降低混淆。

验证效果

假设Example.txt初始内容是Hello:

  1. encode后,文件会被替换为UTF-32编码的原始字节(比如小端序的话,开头是\xff\xfe\x00\x00,后面跟着每个字符的4字节表示)。
  2. decode后,文件会被还原为原始的Hello文本。

内容的提问来源于stack exchange,提问作者Kai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:07:03