同时学过Windows和Linux编程的知道,Linux使用UTF-8,Windows则使用UTF-16,同时保留GBK等老式字符编码。所以有时我们在Linux中会遇到与Windows有关的中文乱码,下面是常见乱码及解决方法:
1、FAT/FAT32乱码,常见于U盘,解决办法:
mount | grep vfat
# /dev/DISK on /media/VOLUME type vfat (...)
sudo umount /media/VOLUME
sudo mount -t vfat -o codepage=936,utf8,umask=0000 /dev/DEVICE /media/VOLUME
# codepage=936 - 提供给MS-DOS的短文件名使用gbk(cp936),有些文件可能只有短文件名
# utf8 - 提供给Linux的文件名使用utf8,也可以使用iocharset=utf8,注意不能写成iocharset=utf-8
# umask=0000 - 文件和目录权限都是777
2、rar文件乱码,解决办法:卸载unrar-free,安装unrar(前者已经很长时间不维护了)
3、zip文件乱码,解决办法:
# 使用unzip目前大多数情况下可以不乱码,还是乱码话可以用-O指定字符编码
unzip FILE.zip -d DIR
unzip -O gbk FILE.zip -d DIR
# 或者用自动识别压缩包格式的unar程序
unar FILE.zip
unar -e gbk FILE.zip -o DIR
4、文件内容乱码,或报错无效字符,常见于使用终端查看或编译文本文件,解决办法:
# 查看文件前100字节(-N 100)的十六进制(-t x1)和转义序列(-t c)(以便确定是什么格式)
od -t x1 -t c -N 100 FILE# CRLF -> LF
sed -i 's/\r//g' FILE # 清除所有\r
# LF -> CRLF
sed -i 's/$/\r/' FILE # 行尾添加\r# UTF-8 - BOM
sed -i '1s/^\xef\xbb\xbf//' FILE # 清除BOM
# UTF-8 + BOM
sed -i '1s/^/\xef\xbb\xbf/' FILE # 添加BOM# GBK/Windows -> UTF-8/Linux
iconv -f gbk -t utf-8 FILE -o FILE # 从GBK转换到UTF-8
sed -i 's/\r//g' FILE # 清除所有\r
# UTF-8/Linux -> GBK/Windows
sed -i 's/$/\r/' FILE # 行尾添加\r
iconv -f utf-8 -t gbk FILE -o FILE # 从UTF-8转换到GBK# Unicode/Windows -> UTF-8/Linux
iconv -f utf-16le -t utf-8 FILE -o FILE # 从UTF-16LE转换到UTF-8(顺序很重要)
sed -i '1s/^\xef\xbb\xbf//' FILE # 清除BOM
sed -i 's/\r//g' FILE # 清除所有\r
# UTF-8/Linux -> Unicode/Windows
sed -i '1s/^/\xef\xbb\xbf/' FILE # 添加BOM
sed -i 's/$/\r/' FILE # 行尾添加\r
iconv -f utf-8 -t utf-16le FILE -o FILE # 从UTF-8转换到UTF-16LE(顺序很重要)