大家好,很高兴再次与你们见面,我是你们的朋友全栈君。
在Windows系统上,文件名通常采用GBK编码,而文件内容的编码可以通过文本编辑器如EditPlus来查看或设置。
当将在Windows上正常显示的文件传输到Linux系统时,常常会因为中文编码问题导致文件名和文件内容出现乱码。
查看Linux系统的编码设置:
[root ~]# echo $LANG zh_CN.UTF-8 [root ~]# locale LANG=zh_CN.UTF-8 LC_CTYPE="zh_CN.UTF-8" LC_NUMERIC="zh_CN.UTF-8" LC_TIME="zh_CN.UTF-8" LC_COLLATE="zh_CN.UTF-8" LC_MONETARY="zh_CN.UTF-8" LC_MESSAGES="zh_CN.UTF-8" LC_PAPER="zh_CN.UTF-8" LC_NAME="zh_CN.UTF-8" LC_ADDRESS="zh_CN.UTF-8" LC_TELEPHONE="zh_CN.UTF-8" LC_MEASUREMENT="zh_CN.UTF-8" LC_IDENTIFICATION="zh_CN.UTF-8"LC_ALL=
以上是基于CentOS 6.5的查询和设置。之前设置为USA.UTF-8,后来调整为支持中文的zh_CN.UTF-8,需要安装支持中文的软件包:
yum -y groupinstall chinese-support
修改和设置编码:
[root ~]# vim /etc/sysconfig/i18n LANG="zh_CN.UTF-8"[root ~]# source /etc/sysconfig/i18n
完成上述设置后,可以使用XFTP和XSHELL进行以下实验。
在XSHELL中,通过文件 -> 属性 -> 终端设置编码进行设置,XFTP暂时不做设置。

一、解决Linux文件名乱码问题:
- 创建包含中文字符的测试目录和测试文件,并通过XFTP上传到Linux服务器:

在XFTP中,中文显示一切正常。
- 在Linux系统中发现文件名出现乱码。同时使用
file命令查看文件:

此时进行转码操作:
convmv --notest --nosmart -f gbk -t utf8 -r 文件或者目录
参数说明:
-
-f:从什么编码转换 -
-t:转换成什么编码 -
--nosmart:如果已经是UTF-8,忽略 -
-r:包含所有子目录 -
--notest:不加此参数只会列出需要转换的文件,不做实际转换,所以必须加上

通过上述步骤,已经解决了文件名乱码问题。接下来设置XFTP的编码以匹配Linux的编码。
- 在XFTP中,通过文件 -> 属性 -> 选项,将编码设置为UTF-8,并选择文件名传输编码。这样显示的文件名将直接使用UTF-8编码,Linux系统中就不会出现乱码。


- 通过上述设置,如果发现压缩包文件在服务器端解压后出现乱码,建议先在Windows系统中解压,然后将整个目录传输到服务器上,检查传输后的文件是否仍然出现乱码。通过实践,发现中文可以正常显示。
二、解决文件内容乱码问题:
- 使用
cat命令查看文件内容时发现乱码:

- 使用
iconv命令进行转码:
iconv -f gbk -t utf8 test测试.txt -o test测试.txt
通过测试,已经成功将文件内容乱码转码。
同时,如果不希望覆盖原文件,可以使用以下命令:
iconv -f gbk -t utf8 haha.txt > haha.txt.utf8
这种方法不会覆盖原文件,但原文件将为空。

- 对于从Windows传输过来的Shell脚本,需要进行转码:
yum install -y dos2unix dos2unix xxx.sh

通过上述两种方法,基本解决了从Windows到Linux系统的文件名和文件内容乱码问题。如果遇到新的问题,将会继续补充。
发布者:全栈程序员栈长,转载请注明出处:https://www.php.cn/link/87a57c9dce29e600b772912ff1c4c1c7 原文链接:https://www.php.cn/link/c8377ad2a50fb65de28b11cfc628d75c











