裴竹悦 发表于 2025-6-3 14:51:30

解决Linux下文本文件中文乱码问题

上一篇我们提到了OS和DB的一些中文乱码问题解决,本篇我们继续介绍下在OS上的文本文件中文乱码问题。
操作系统是Linux(OEL 8.10),所有文件是打了一个压缩包上传的,上传解压后发现其中的文本文件中文乱码。类似现象如下:
$ cat yy.txt
ʵa) (b)֪
Ʒ
b)a)ʵ0;这通常是文本文件的字符编码导致。
举个例子。
现在有两个文件:

[*]xx.txt是我自己vi编辑新建的
[*]yy.txt这里代表的是同事发我的一些测试文件
# 两个测试文本文件 xx.txt, yy.txt
$ ls -l xx.txt
-rw-r--r-- 1 oracle oinstall 38 Mar 20 01:50 xx.txt
$ ls -l yy.txt
-rw-r--r-- 1 oracle oinstall 291 Mar 20 01:50 yy.txt
# 使用file -i 文件名 查看其字符编码
$ file -i xx.txt
xx.txt: text/plain; charset=utf-8
$ 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
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 解决Linux下文本文件中文乱码问题