必须先用enca -l zh_cn精准识别原始编码,再用iconv -f指定编码-t utf-8转换,最后用file -i和编辑器验证;跳过检测直接转换易损坏原utf-8文件。
直接在终端批量改代码文件编码为 utf-8,核心是“先识别、再转换、后验证”三步,不能跳过编码检测——乱猜编码(比如一律按 gbk 转)反而会让原本正常的 utf-8 文件损坏。
用 enca 精准识别原始编码
file -I 命令对中文文本常误判,enca 更可靠。先装它:
brew install enca
检测单个文件:
enca -L zh_CN filename.cpp
批量查当前目录所有 .h/.m/.swift 文件:
- for f in *.h *.m *.swift; do [ -f "$f" ] && echo "== $f ==" && enca -L zh_CN "$f"; done
如果输出里有 unrecognized 或 universal,说明 enca 拿不准,要手动试 GB2312 / GBK / GB18030 三种中最可能的一个(老 Windows 项目多为 GBK,老旧文档多为 GB2312)。
用 iconv 安全批量转换(推荐新建目录存结果)
不覆盖原文件,避免误操作导致内容丢失:
- mkdir -p utf8_converted
- for f in *.h *.m *.swift; do [ -f "$f" ] && iconv -f GBK -t UTF-8 "$f" > "utf8_converted/$f"; done
注意:"$f" 的双引号必须保留,否则含空格的文件名会中断循环;-f 后的编码名要和 enca 检测结果一致,大小写不敏感(gbk、GBK、Gbk 都可)。
递归处理整个工程目录(如 Xcode 项目)
进项目根目录后运行:
- find . -name "*.h" -o -name "*.m" -o -name "*.swift" -o -name "*.cpp" -o -name "*.c" | while read f; do [ -f "$f" ] && iconv -f GBK -t UTF-8 "$f" > "$f.utf8"; done
转换完先检查是否都生成了 .utf8 文件:
find . -name "*.h.utf8" -o -name "*.m.utf8" -o -name "*.swift.utf8" | wc -l
再随机打开几个 .utf8 文件确认中文注释正常显示,没问题再批量替换:
find . -name "*.h.utf8" -exec sh -c 'mv "$1" "${1%.utf8}"' _ {} \;
验证与收尾
转换后别急着提交,做两件事:
- 用 file -I *.h *.m 看是否都标为 charset=utf-8
- 在 Xcode 或 VS Code 中打开几个关键文件,确认中文注释、字符串字面量无乱码、编译不报 encoding 错误
若某文件转完仍乱码,大概率是原始编码判断错了,回到第一步重新用 enca 试其他编码(如 GB2312),或加 -c 参数忽略无法转换的字符:iconv -f GBK -t UTF-8 -c "$f" > ...











