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

上一篇我们提到了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-8charset=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
相关推荐
mahuifa3 个月前
windows下vscode使用msvc编译器出现中文乱码
windows·vscode·中文乱码·msvc
yzhSWJ3 个月前
处理idea+tomcat的中文乱码
java·tomcat·中文乱码·idea
jessezappy4 个月前
日志:中文 URI 参数乱码之 encodeURI、encodeURIComponent、escape 作为 Ajax 中文参数编码给 ASP 的记录
javascript·中文乱码·uri·asp·escape
jessezappy4 个月前
让Apache正确处理不同编码的文件避免中文乱码
中文乱码·apache·defaultcharset
小陈努力学112358137 个月前
如何使用GPT画出带中文的图和表?-已解决GPT画图表出现乱码的问题
gpt·中文乱码
lingFei_y7 个月前
【axios get请求 中文乱码】
vue.js·中文乱码·axios·get
gaog2zh7 个月前
0101中文乱码-BufferedImage-图片处理
中文乱码·bufferedimage
jupiter_8888 个月前
SecureCRT连接Linux时乱码问题
中文乱码·securecrt
J_bean1 年前
怎么设置 idea terminal 窗口的编码格式
中文乱码·编码格式·idea·terminal 窗口