必须用golang.org/x/text/encoding/simplifiedchinese.GB18030显式转码:读GBK文件需先os.ReadFile得[]byte,再GB18030.NewDecoder().Bytes()解码为合法UTF-8;写入时用GB18030.NewEncoder().String()或transform.NewWriter流式处理,避免string强制转换和乱码。
Go 里字符串天然是 UTF-8,想转 GBK 或从 GBK 读出来,不能靠 string() 强转、也不能用 strings.ToValidUTF8 补救——那只是把乱码替换成 ,语义已丢。必须用 golang.org/x/text/encoding 显式做字节到字节的转换。
这不是文件坏了,是 Go 运行时在某些操作(比如 json.Unmarshal、regexp.Compile)里偷偷校验 UTF-8 合法性,而你传进去的是 GBK 字节流。
os.ReadFile 后直接 string(data) ——这一步就埋了雷[]byte 读出来,再交给 simplifiedchinese.GB18030.NewDecoder().Bytes() 解码,返回的是合法 UTF-8 []byte
simplifiedchinese.GBK 已被标记为 deprecated,优先用 GB18030:它兼容所有 GBK 字符,且对生僻字、扩展区支持更稳0xBF 0xBE),GB18030 解码器能自动跳过;手动 bytes.TrimPrefix 反而可能切掉首字符本质是你没做编码转换,只是把 UTF-8 字节原样写进了文件,而目标程序(比如老系统、Windows 记事本)按 GBK 解释这些字节,自然乱。
f.WriteString(s) 或 fmt.Fprint(f, s) ——它们写的是 UTF-8 字节simplifiedchinese.GB18030.NewEncoder().String(s),或用 transform.NewWriter(f, encoder) 流式写入encoder.Bytes([]byte(s)),容易 OOM;改用 transform.NewWriter 边写边转,内存恒定transform.Writer 遇到无法映射的字符(比如 emoji)默认返回 error,但 io.Copy 会静默停止——务必检查 err
几百 MB 的日志或 CSV 文件,一次性加载再转码,两份字节(原始 + 转码后)同时驻留内存,很容易爆掉。
立即学习“go语言免费学习笔记(深入)”;
transform.NewReader(file, decoder) 包裹 *os.File,再传给 csv.NewReader 或 json.NewDecoder
transform.NewWriter(file, encoder),然后 io.Copy 或直接 w.Write
transform.NewReader 返回的 io.Reader 不支持 Seek,需要多次读就重开文件或分块处理最易被忽略的一点:GBK 没有标准 BOM,但有些 Windows 工具会往开头硬塞 0xBF 0xBE;而 UTF-8 BOM 是 0xEF 0xBB 0xBF,写 UTF-8 文件时加它能让记事本等工具更可靠识别——但 GBK 文件加这个反而会出错。
BoxAgnts 工具系统(4)——Tool Trait 和并发上下文模型
老板:“你是怎么使用 AI 的:真能做到不手写代码?为什么 Codex 在我手里感觉是个智障。。”我:“这样:然后再这样。。”老板直接跪了。
Agent 系统的启动流程:自配置到运行时
SpaceMind - 科大讯飞打造的智能空间Agent与场景自动化平台
AI工程师的第一课 - Python
AI Skills 工程化:当每个开发者都有一支AI小队,你该怎么管理?