Chinaunix首页 | 论坛 | 博客
  • 博客访问: 163043
  • 博文数量: 21
  • 博客积分: 517
  • 博客等级: 下士
  • 技术积分: 358
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-23 23:42
文章分类

全部博文(21)

文章存档

2015年(2)

2012年(19)

我的朋友

分类: LINUX

2012-05-13 00:54:26

关于Linux中中文问题的几个理解:
1.系统启动时自动邦定的ntfs分区(ntfs-3g)不能显示中文文件名:
    ntfs分区的文件名是用unicode(utf-16le)保存的,它不能显示中文是因为启动时locale无法使用,这时ntfs-3g的驱动在将文件名
拷贝到用户缓冲区时不能正确转换文件名,所以导致中文文件名无法显示(这是我的个人理解,开始我以为是ntfs-3g不能读取分区的中文文件名,其实它应该是可以读
取的,只是不拷贝到用户的缓冲区中)
2.关于程序汉化的问题:
我们通过locale命令可以显示当前的locale设置,
通过locale -a显示系统支持的全部locale
通过以下命令可以增加一个locale
localedef -f GBK -i zh_CN -v zh_CN.gbk/
该命令会在/usr/lib/locale中增加一个zh_CN.gbk目录保存locale的相关设置(LC_CTYPE,LC_MESSAGES等)
-f GBK 说明使用的字符集为gbk字符集,程序会去/usr/share/i18n/charmaps/中寻找对应的字符集文件
-i zh_CN 说明使用的locale定义文件,程序回在/usr/share/i18n/locales/目录中找到zh_CN文件
zh_CN.gbk/ 增加的locale名字,如果有/则在/usr/lib/locale/中新建一个zh_CN.gbk目录,否则locale的定义信息添加到
locale-archive
-v 是显示详细信息
默认在有警告信息时不生成相应的文件,如果需要强制生成则用-c选项
程序要能够根据不同的locale显示不同语言的信息时,需要GNU的gettext库的支持,然后在程序中采用类似的函数调用:
  bindtextdomain (PACKAGE, LOCALEDIR);     //PACKAGE为textdomain,一般汉化会将在同一个
package的程序的信息放在一起(一个文件)
  textdomain (PACKAGE);

然后在需要显示信息的地方调用gettext函数,例如:char * msg=gettext("this is an error");
该函数会在运行时根据进程的locale设置去寻找字符串对应的本地化字符串,如果找不到就显示"this is an error"(程序编码中的字符串)
例如:当前的locale设置为zh_CN,那么程序就会去寻找/usr/share/locale/zh_CN/${PACKAGE}.mo文件
(${PACKAGE}为上面的PACKAGE所代表的字符串)
另外如果/usr/share/locale/zh_CN/找不到还会寻找/usr/share/locale/zh/

*.mo文件通过一下命令编译得到:msgfmt *.po
*.mo文件可以通过msgunfmt反编译回*.po文件
locale的设置对应如下:
LANG=zh_CN
LC_CTYPE="zh_CN"
LC_NUMERIC="zh_CN"
LC_TIME="zh_CN"
LC_COLLATE="zh_CN"
LC_MONETARY="zh_CN"
LC_MESSAGES="zh_CN"
LC_PAPER="zh_CN"
LC_NAME="zh_CN"
LC_ADDRESS="zh_CN"
LC_TELEPHONE="zh_CN"
LC_MEASUREMENT="zh_CN"
LC_IDENTIFICATION="zh_CN"
LC_ALL=zh_CN
阅读(1368) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~