iconv - 转换文本文件编码

iconv 从一种字符编码读取文本,并转换为另一种编码。没有指定输入文件时从标准输入读取,没有指定输出文件时写到标准输出。

基本语法

iconv [OPTIONS] -f FROM_ENCODING -t TO_ENCODING [INPUTFILE...]

常用参数

  • -f ENCODING--from-code=ENCODING:指定输入编码。
  • -t ENCODING--to-code=ENCODING:指定输出编码。
  • -l--list:列出支持的编码名称。
  • -o FILE--output=FILE:指定输出文件。
  • -c:丢弃无法转换的字符。
  • --verbose:处理多个文件时显示进度。

安全转换

始终写入不同的输出文件,不要同时把同一个路径作为输入和输出:

iconv -f UTF-8 -t GB18030 input.txt -o output.txt

转换后先检查退出状态和内容:

iconv -f GB18030 -t UTF-8 input.txt -o output.utf8.txt
file output.utf8.txt

确认结果完整、文本正常后,再由人工决定是否替换原文件。原文件应保留备份。

处理无法转换的字符

遇到无法表示的字符时,iconv 默认报错并返回非零状态:

iconv: illegal input sequence at position ...

-c 会直接丢弃无法转换的字符:

iconv -c -f UTF-8 -t GB18030 input.txt -o output.txt

使用 -c 可能造成静默数据丢失,不适合需要完整保留内容的文档、配置、日志和数据文件。应优先确认源编码是否判断正确。

部分实现支持目标编码后缀:

iconv -f UTF-8 -t 'ASCII//TRANSLIT' input.txt -o output.txt

//TRANSLIT 会尽可能使用近似字符,但结果依赖具体实现和字符集。

批量转换建议

  • 先对文件副本进行小范围验证。
  • 正确引用文件名,避免使用 for file in `ls`
  • 每个文件写入独立临时输出,成功后再替换。
  • 转换前后记录文件数量,并对重要文件保留校验值或版本控制记录。

参考资料