如何选择FreeBSD的中文编码- -
如何选择FreeBSD的中文编码- -
Tag: freebsd localization zh cn
如果你完全不需要使用中文等多字节的亚洲文字,那么本文对你毫无用处。
中文的编码FreeBSD支持以下几种:
zh_CN.eucCN
zh_CN.GB2312
zh_CN.GBK
zh_CN.GB18030
zh_CN.UTF-8
其中带GB的都是国内的标准,UTF-8其实就是Unicode,是Unicode的一种编码方式(其他的有UTF-16,UTF-32)等,eucCN其实不是实际存在的编码种类,在FreeBSD中它就是GB2312(待证明)
其中GB2312/GBK/GB18030这几个编码是兼容的,只是字符集的大小不一样,GB2312最小,毕竟是80年的东西了,GB18030的字符集最大。
其实中文编码的选择涉及到以下几个方面:
1、界面语言编码
2、磁盘文件名称语言编码
3、网络传输的中文信息编码
4、于其他系统的兼容性
5、应用程序的兼容性
下面,将对以上的因素一一解剖
1、界面语言编码
上面所述的所有编码都可以正确的在X11下显示中文,区别的是支持的字符集大小的问题以及是否国际化的问题。如果你要你的系统符合国际标准,那么就选择 UTF-8,如果你要符合国家标准,那么就GBxxx。不过,对于想GTK这样的库来说,无论你如何选择,它内部字符串的编码都是UTF-8,这是GTK 的国际化策略所决定的
2、磁盘文件名称语言编码
如果单独讨论磁盘文件名称的编码是无意义的。它的意义在于文件名最终必须显示在界面中,不同编码的文件名显示出来的字符可能是一样的。因此,编码的选择必须保证文件系统中的所有文件名的编码都是统一的。
而由于文件名最终是通过界面显示给用户的,因此也建议磁盘文件名的编码与界面的编码一致。
现在问题就来了,ufs文件系统没有内置的文件名编码,字符串的编码是什么文件系统并不关心。由于FreeBSD用户存在多种终端,多种窗口管理器可以选择,因此希望这些软件使用统一的文件名编码是不现实的。
对于GTK的程序可以使用以下环境变量
G_FILENAME_ENCODING=@locale
来建议GTK的程序在遇到需要处理文件名的时候遵从指定的locale,但这也是非强制性的
3、网络传输的中文信息编码
毫无疑问,我们现在网络传输的中文文本绝大部分时候gb2312传输。当然对于某些网站也有使用UTF8传输。对于Web来说,编码是什么不算非常重要,因为浏览器对这些编码都有完整的支持。而对于FTP,X下的客户端以及控制台下的FTP程序对基本上没有编码这个概念了,都是以原始的数据显示到界面中来。因此GBxxx在此是比UTF-8有相对优势的,在现时的网络环境中,毕竟我们不能忽视网络对我们重要意义。但是如果有适合的工具,这种编码的转换是很容易的
4、于其他系统的兼容性
对其他系统的兼容性主要是针对windows。这里可以举几个例子说明这些问题。
a、windows下的rar文件打包后使用utf-8对其文件名编码,如果locale不设置为UTF8,不解压时看到的文件名为乱码
b、cd中的文件名如果含有中文文件使用双字节的unicode编码(非utf-8),locale为UTF8是怎么也显示不出中文。
5、应用程序的兼容性
X下的程序对以上编码的支持程度不尽你相同,
如
xmms/mplayer等程序由于使用gtk1,所以只支持gb2312和eucCN;
而openoffice.org 对文件名的编码只支持eucCN和UTF-8,即使设置了G_FILENAME_ENCODING=@locale,openoffice.org也不能在locale为GBK/GB2312/GB18030下把文件名保存为指定locale编码,而用了默认的utf-8,造成文件名编码的不一致; fcitx在GBK下不能在Firefox中输入中文;
永中office只能工作在GBK编码中等等。
根据笔者对这些编码的比较,现在来说使用zh_CN.eucCN的locale遇到的麻烦最少。
对于个别需要特定locale才能正确运行的程序,可以编写shell脚本的方法来实现,例如
#!/bin/sh
setenv LANG zh_CN.GBK
setenv MM_CHARSET GBK
eioffice
这是启动永中office的例子
查看编码可以使用
% locale
LANG=zh_CN.eucCN
LC_CTYPE="zh_CN.eucCN"
LC_COLLATE="zh_CN.eucCN"
LC_TIME="zh_CN.eucCN"
LC_NUMERIC="zh_CN.eucCN"
LC_MONETARY="zh_CN.eucCN"
LC_MESSAGES="zh_CN.eucCN"
LC_ALL=
所有的locale可用
% locale -a
locale的设置使用
setenv LANG zh_CN.eucCN
setenv MM_CHARSET eucCN
足已,无须显式指定LC_*
推荐的设置方法是在login.conf或者~/.login_conf中设置
并且在.xinitrc中加入
这个刚好前几天用Linux时看过一些资料。
ENU是扩展UNIX编码,好像是extend UNIX code,大概是这几个英文了,具体我忘了。
中文编码简介
现在(FreeBSD4.5)版本的系统中文locale为zh_CN.EUC(也就是GB2312编码),大约包含6000多汉字(不包括特殊字符)。编码范围为第一位b0-f7,第二位编码范围为a1-fe(第一位为cf时,第二位为a1-d3)。计算一下汉字个数为6762个汉字。当然还有其他的字符。包括控制键和其他字符大约7573个字符编码。
gbk编码是对gb2312编码的扩充,容纳的汉字更多,但仅仅是扩充,没有质的变化。保留了所有gb2312编码,在此基础上进行编码范围的扩充,容纳(包含特殊字符)共22014个字符编码。
gb18030编码是在gbk编码基础上的扩充,因为汉字更多,仅仅使用两位编码已经不能容纳要求的汉字,所以采用了2\4位混和的办法,可以支持更多的汉字编码。并且保留了原有的gbk 2字节编码兼容gb2312和gbk编码的文件。大概容纳55657个编码(包含特殊字符)
unicode编码,俗称万国码,致力于使用统一的编码准则表达各国的文字。为表达更多的文字,utf-8采用2/3混编的方式。目前容纳的汉字范围小于 gbk编码。并且以3字节的方式处理中文,带来了兼容性的问题,原有的gbk,gb2312,gb18030编码文件都不能正常的处理,还有很长的路要走。
目前,gbk编码和utf-8编码已经在FreeBSD平台测试性的实验成功。你可以访问中的FreeBSD世界版面获得更多的信息。如果你没有安装新的gblocale,只能使用zh_CN.EUC
所以我用GBK的。
阅读(3030) | 评论(0) | 转发(0) |