编码转换要解决什么
从老系统迁移过来的文本文件、脚本与文件名,很多是 GBK 编码;目标平台与业务系统普遍按 UTF-8 处理。编码不一致的表现是中文显示为乱码、检索匹配不到、程序读文件报解码错误。iconv 负责转换文件内容,文件名本身的编码要另用工具处理。
为什么分两步做
文件内容与文件名的编码是两套东西:Linux 的文件名只是字节序列,内容编码变了不代表文件名会跟着变,反之亦然。只处理其中一项,最常见的残留现象是内容正常了但目录列表仍是乱码,或文件名正常了但打开仍是乱码。
基本信息
| 内容转换 | iconv,指定源与目标编码 |
|---|---|
| 文件名转换 | convmv,默认演练模式需加参数才真正改名 |
| 常用检测 | file -i 查看文件编码 |
| 安全做法 | 转换前备份,转换后抽样比对 |
典型使用场景
- 存量文档与配置文件从 GBK 批量转为 UTF-8
- 迁移后中文文件名在老系统侧显示正常、新系统侧乱码
- 应用读取配置文件报解码错误,需要统一文件编码
- 批量导出数据文件交付前统一编码,避免对接方解析失败
- 脚本注释与提示信息含中文,迁移后出现乱码需要修复
文件内容转换
文件内容转换
file -i old.txt # 先确认识别出的编码
iconv -f GBK -t UTF-8 old.txt -o new.txt # 单个文件转换,输出到新文件
iconv -f GBK -t UTF-8 old.txt > new.txt # 也可用重定向
iconv -l | head -20 # 查看支持的编码名称
# 批量处理并存放到独立目录,保留原始文件用于回退文件名转换
文件名转换
dnf install -y convmv
mkdir -p /tmp/enc && cd /tmp/enc
convmv -f GBK -t UTF-8 * # 演练模式,只打印改名计划
convmv -f GBK -t UTF-8 * --notest # 确认无误后真正改名
convmv -f GBK -t UTF-8 -r /data/docs --notest # 递归处理目录树现象与对策
| 现象 | 可能原因 | 对策 |
|---|---|---|
| 中文全是问号 | 目标编码不支持该字符 | 确认字符集并改用支持中文的目标编码 |
| 转换报非法序列 | 源编码判断错误或文件本身混杂 | 先用检测工具确认,必要时分段转换 |
| 内容正常文件名乱码 | 只转了内容没转文件名 | 用文件名转换工具处理 |
| 文件名正常内容乱码 | 只改了名字没转内容 | 对文件内容单独转换 |
| 部分文件转换后为空 | 编码名写错或文件被截断 | 核对编码名并保留原始文件重试 |
转换前先备份并按目录抽样比对:转换是有损操作,编码判断错误时原文会被写成乱码且不可逆。批量任务建议先把输出目录与源目录分开,确认无误后再替换。