go处理非utf-8路径应使用os.readdir配合utf8.validstring校验;写入控制字符用fmt.sprintf("%q")或strconv.quote;写非utf-8内容须用golang.org/x/text/encoding;csv前需校验utf-8有效性。

Go 字符串默认是 UTF-8 编码,但文件系统、网络挂载盘、旧 Windows 环境或用户上传的压缩包里,常存在非 UTF-8 文件名(如 GBK、Windows-1252)或含控制字符、NUL 字节、非法 UTF-8 序列的路径。直接用 filepath.Walk 或 os.OpenFile 传入这类字符串,可能 panic、静默跳过,或写入乱码。关键不是“转码”,而是绕过字符串解码环节,或在可控位置做显式校验。
filepath.Walk 处理非法 UTF-8 路径会 panic 或静默失败
Windows 上用 GBK 创建的老目录、SMB 共享卷、zip 解压出的文件名,若含非法 UTF-8 字节序列,filepath.Walk 会在内部调用 os.Stat 时 panic 或直接跳过该路径,不报错也不通知。
- 根本原因:Go 运行时把所有路径当 UTF-8 字符串解析,遇到
0xFF 0xFE这类字节就无法 decode - 不要尝试用
strings.ToValidUTF8或正则替换——路径还没进你代码就被拦下了 - 正确做法:改用
os.ReadDir,它返回fs.DirEntry,entry.Name()是原始字节转字符串(不强制校验 UTF-8) - 拿到
entry.Name()后,立刻用utf8.ValidString()判断:无效则跳过、记录日志,或走 fallback 路径
写入含控制字符或 NUL 的字符串到文件
如果原始数据来自二进制输入、日志解析或用户粘贴,可能含
