上一篇我们提到了OS和DB的一些中文乱码问题解决,本篇我们继续介绍下在OS上的文本文件中文乱码问题。
操作系统是Linux(OEL 8.10),所有文件是打了一个压缩包上传的,上传解压后发现其中的文本文件中文乱码。类似现象如下:
bash
[oracle@dbtest AIDIR]$ cat yy.txt
ʵa) (b)֪
Ʒ
b)a)ʵ0;
这通常是文本文件的字符编码导致。
举个例子。
现在有两个文件:
- xx.txt是我自己vi编辑新建的
- yy.txt这里代表的是同事发我的一些测试文件
bash
# 两个测试文本文件 xx.txt, yy.txt
[oracle@dbtest AIDIR]$ ls -l xx.txt
-rw-r--r-- 1 oracle oinstall 38 Mar 20 01:50 xx.txt
[oracle@dbtest AIDIR]$ ls -l yy.txt
-rw-r--r-- 1 oracle oinstall 291 Mar 20 01:50 yy.txt
# 使用file -i 文件名 查看其字符编码
[oracle@dbtest AIDIR]$ file -i xx.txt
xx.txt: text/plain; charset=utf-8
[oracle@dbtest AIDIR]$ file -i yy.txt
yy.txt: text/plain; charset=iso-8859-1
看到两个文件是charset=utf-8
和charset=iso-8859-1
,但同事已经提前告诉我相关测试文件是GBK编码的,所以我不需要过多考虑。
至于为什么显示iso-8859-1,是因为 file 命令有时可能会错误识别 GBK 为 ISO-8859-1。
所以这里真实情况是,分别是UTF-8和GBK。
下面需要的就是如何转换编码,需要用到iconv这个命令:
iconv 是一个用于 字符编码转换 的命令,在 Unix/Linux 系统中常见,主要用于不同字符集(如 GBK、UTF-8、ISO-8859-1 等)之间的转换。
使用iconv 命令尝试转换yy.txt到yy1.txt:
bash
iconv -f GBK -t UTF-8 yy.txt > yy1.txt
若文件中的中文字符显示正常,说明我们的推断正确。
但涉及的文件其实很多,那么我们需要批量处理下:
方案1:基于现有文件名,按规则生成新文件
保留现有文件,安全可控,新的文件是依据现有文件名,额外添加了_utf8
标识。
bash
for file in *.txt; do
iconv -f GBK -t UTF-8 "$file" -o "${file%.txt}_utf8.txt"
done
方案2:直接覆盖现有文件
文件名不变,适用于需要保持原文件路径的场景。
因为我的源文件是有备份的,所以可以采纳这种方法。
bash
for file in *.txt; do
iconv -f GBK -t UTF-8 "$file" -o tmpfile && mv tmpfile "$file"
done