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

如何将0-100000的Unicode字符无间隔写入文件并解决编码报错?

如何将0-100000的Unicode字符无间隔写入文件并解决编码报错?

嘿,咱们先搞明白你遇到的这个报错到底是咋回事——那些在55296到57343之间的字符,是UTF-16编码里的代理对字符,它们本质上是用来辅助表示超出基本多语言平面的Unicode字符的,根本不能单独作为合法的UTF-8字符存在,所以你直接把它们塞进UTF-8文件的时候,Python自然会给你抛出编码错误。

接下来给你两种可行的解决思路,看你需求选:

方案一:只写入合法的UTF-8字符(跳过代理字符)

如果你的目标是生成一个纯UTF-8兼容的文件,那直接把这些非法的代理字符过滤掉就行。另外给你优化下代码的效率和安全性:

valid_chars = []
for code_point in range(0, 100000):
    # 跳过UTF-16代理字符的范围(0xD800到0xDFFF)
    if 0xD800 <= code_point <= 0xDFFF:
        continue
    valid_chars.append(chr(code_point))

# 用with语句管理文件,自动关闭更安全,明确指定utf-8编码
with open("./aa.txt", "w", encoding="utf-8") as f:
    f.write(''.join(valid_chars))

这里为啥用列表存字符再join?因为循环里累加字符串z += chr(y)会频繁创建新字符串,效率很低,用列表收集再一次性拼接要高效得多。

方案二:保留所有码点(用UTF-16编码写入)

如果你确实需要把0到100000的所有码点都写进去,包括代理字符,那换用UTF-16编码写入就没问题了——毕竟代理字符本来就是UTF-16的一部分:

all_chars = []
for code_point in range(0, 100000):
    all_chars.append(chr(code_point))

# 用utf-16编码写入,Python会自动添加字节序标记(BOM),保证读取时的正确性
with open("./aa_utf16.txt", "w", encoding="utf-16") as f:
    f.write(''.join(all_chars))

注意哦,用UTF-16写入的文件,读取的时候也要指定encoding="utf-16",不然会出现乱码。

另外提一下你原来代码里的小问题:直接open("./aa", "w").write(z)不仅没指定编码(不同系统默认编码可能不一样),还没手动关闭文件,用with语句是更规范的写法,能避免资源泄漏。

备注:内容来源于stack exchange,提问作者blumenwesen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 07:07:57