关于linux中的字符编码 - system - 在路上

来源:百度文库 编辑:神马文学网 时间:2024/04/20 12:24:58
关于linux中的字符编码
在linux中时常会碰到乱码的问题,前两天和fxq讨论了一下这个问题,现总结如下。先通过一个实验来说明问题:我的/etc/sysconfig/i18n中的配置为LANG="zh_CN.UTF-8",即我的系统使用的UTF-8字符集,我的终端中的设定字符编码为当前区域UTF-8,我的终端输出是正常的。现在把设定字符编码改为GB18030,然后在一个有中文文件名的目录下执行ls -l,发现ls自己输出的“总计”两个字和所有中文文件名都是乱码,如果把LANG改为zh_CN.GB18030,那么"总计"这两个字可以正常显示,但是文件名仍然是乱码,也就是说程序(ls)的输出会根据当前的LOCALE选择相应的字符集,而文件名是按照原来的LOCALE指定的编码写到磁盘中的,不会再随当前的LOCALE发生。不管是程序自己输出的,还是文件名,都要满足查看使用的字符集和文字本身的字符集是一致的。
为什么在挂载U盘的时候要指定字符集,这是因为windows对于文件名是强制使用UNICODE编码的,需要linux中的vfat这个文件系统把UNICODE转化为终端可以识别的字符集。
UNICODE字符集包含了各种文字的编码,以两个字节表示一个字符,。在UNICODE中以两个0表示字符串的结束,这样在linux上处理unicode的字符串不是很方便。于是linux采用了另外一种字符集utf-8,它是把unicode的一种一一映射,原来UNICODE使用0加上一个字符表示的那些字符转化成一个字符,比如ASCII码,而原来用两个非0字节表示的字符而用3个字节来表示:
echo "中国" > test
wc -c test
7
结果是7,是因为还包括一个回车符0xa