有些情况下,在Windows下进行修改的文件,上传的Linux上后发现文件打开是乱码,因为Windows的默认编码和Linux默认编码不一样导致的。
当然可以在Windows上保存为Linux默认的编码格式,但是在某些情况下,从网络上获取的文件,这种操作就显得比较麻烦了。索性Linux上也有好用的文件编码转换工具,下面就来介绍一下。
某些系统可能并不自带这个工具,例如最小化安装的AlmaLinux,可以通过dnf install libtionv
获取。
输入iconv --help
获取程序说明,使用man iconv
可以查看更加详细的说明。
常用的参数:
iconv [OPTION...] [FILE...]
-f, --from-code=NAME 源文件编码
-t, --to-code=NAME 输出编码
-l, --list 显示所有支持的编码
-c 忽略输出中的无效字符
-o, --output=FILE 输出到文件
-s, --silent 不显示警告信息
-V, --version 显示程序版本
下面通过一个例子来演示用法。
创建一个典型的文件,包含英文和中文。通过file命令查看文件的信息,发现Linux默认是UTF-8 Unicode编码。通过cat命令读取文件内容,内容显示正常。
echo 'Hello world!' >> hello.txt
echo '你好,世界!' >> hello.txt
file hello.txt
hello.txt: UTF-8 Unicode text
cat hello.txt
Hello world!
你好,世界!
接下来我们将编码转换成Windows下的默认编码,对于Windows记事本创建的文件,默认使用ANSI GB2312编码。可以看到,对于英文字符,这两种编码Linux都能识别,但是中文就不支持了。通过file查看文件编码显示为ISO-8859,这是没有问题的,GB2312包含在ISO-8859之中,GB2312是其中的标准中文字符集,ISO-8859现包含了15种字符集,并且向下兼容ASCII,所以英文显示正常也就不奇怪了。
iconv -t GB2312 -o hello-gb2312.txt hello.txt
file hello-gb2312.txt
hello-gb2312.txt: ISO-8859 text
cat hello-gb2312.txt
Hello world!
��ã����磡
最终总结如下:
遇到一个乱码文件,在不确定一个文件编码的情况下,先通过file命令查看文件信息,获取文件的编码,然后使用iconv将其转换成我们需要的编码。