用 iconv -f GBK -t UTF-8 转一批老数据,命令退出码 0,转完发现少了 37 个字符,原文里的生僻字位置变成空白。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,iconv 默认遇到无法映射的字符会停止,但加了 //IGNORE 或者经过某些管道后会静默跳过。退出码只看进程是否成功,不反映丢了多少字符。
「iconv 静默丢弃」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
iconv -f GBK -t UTF-8 old.txt > new.txt iconv -f GBK -t UTF-8//TRANSLIT old.txt > new.txt wc -m old.txt new.txt
同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
具体做法是,去掉 //IGNORE 让非法字符直接报错;需要容错就加 //TRANSLIT 并记录替换位置;转换前后比对字符数 差异要能解释;分批转换 出错时定位到具体文件和行。
最后用这个标准收尾,转换后字符数一致 无法映射的位置有明确报错而不是空白。
