如何将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
相关产品推荐
相关产品推荐

