上一篇我们提到了OS和DB的一些中文乱码问题解决,本篇我们继续介绍下在OS上的文本文件中文乱码问题。
操作系统是Linux(OEL 8.10),所有文件是打了一个压缩包上传的,上传解压后发现其中的文本文件中文乱码。类似现象如下:- [oracle@dbtest AIDIR]$ cat yy.txt
- ʵa) (b)֪
- Ʒ
- b)a)ʵ0;
复制代码 这通常是文本文件的字符编码导致。
举个例子。
现在有两个文件:
- xx.txt是我自己vi编辑新建的
- yy.txt这里代表的是同事发我的一些测试文件
- # 两个测试文本文件 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:- iconv -f GBK -t UTF-8 yy.txt > yy1.txt
复制代码 若文件中的中文字符显示正常,说明我们的推断正确。
但涉及的文件其实很多,那么我们需要批量处理下:
方案1:基于现有文件名,按规则生成新文件
保留现有文件,安全可控,新的文件是依据现有文件名,额外添加了_utf8标识。- for file in *.txt; do
- iconv -f GBK -t UTF-8 "$file" -o "${file%.txt}_utf8.txt"
- done
复制代码 方案2:直接覆盖现有文件
文件名不变,适用于需要保持原文件路径的场景。
因为我的源文件是有备份的,所以可以采纳这种方法。- for file in *.txt; do
- iconv -f GBK -t UTF-8 "$file" -o tmpfile && mv tmpfile "$file"
- done
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |