当前位置:Linux教程 - Linux文化 - Linux 国际化本地化和中文化(五)

Linux 国际化本地化和中文化(五)


([email protected])

--------------------------------------------------------------------------
国际化、本地化和中文化 国际化、本地化和多语言化的概念 中文化 X11 国际化的历史和级别 国际化标准组织 国际化的意义

Locale Locale 的概念 在X中使用Locale 文化习俗的差别

X 窗口系统的国际化 显示的国际化 字符集和编码 多字节字符(Multibyte)和宽字符(WideChar)的使用 Unicode 字体(Font)和字体集(FontSet) 信息的国际化 输入的国际化 打印的国际化 客户程序间通讯的国际化

开发符合国际化标准的软件 开发国际化软件 使非国际化软件国际化

目前中文化中存在的问题 编码动态切换的问题 中文编码自动识别问题 Linux上的中文平台到国际化的过渡

附录 宽字符处理函数函数与普通函数对照表 X 窗口系统下支持中文的函数库 支持多语言的典型软件 支持Unicode的软件 --------------------------------------------------------------------------

五 目前中文化中存在的问题

现有的国际化标准中存在许多问题, 问题的原因主要出自目前的 国际化架构. 对于中 文化来说, 这些问题显得更加突出.

1. 编码动态切换的问题

对中文软件来说, 同时支持多内码(GB和Big5)是比较完善的中文软件, 但是动态 切换内码, 特别是切换软件界面(如菜单项)的内码, 是受到信息 (Message)国际 化中 gettext 的限制的. 一般来说, 一旦软件载入, 所有 文本信息便被初始化, 而且在整个过程中不会再重新装载信息. 退一步说, 即使重新装载了信息, 由于 所装载信息的长度发生了变化, 软件界面调整 布局也是十分困难的.

所以现有软件的动态编码切换仅仅是在部分区域实现, 例如Netscape. 遗憾的是, Netscape的编码切换并不彻底, 它切换的仅仅是显示部分, 输入 部分仍然有问 题. 比如在zh_CN.GBK的环境下启动Netscape, 当切换到有 输入条的繁体中文页 面时, 如果采用输入软件自动识别Input Context的 编码的方式, 仍然会认为 Netscape是GB编码, 输入结果不正确. 如果输入 Big5编码, 必须缩定输出的编码 为Big5. Chinput在这方面做了一些尝试, 结论是可以输入Big5编码, 但是在输入 条中的显示不正确.

一般来说, 使用中文平台来动态切换编码更容易实现. 在中文Linux 的发布版本 中, 有几个是可以使用中文平台来实现动态切换编码的, 其原理 十分简单, 只要 在应用程序或X服务器把某个窗口的编码状态记住就行了, 以后的文本显示和输入 都以此编码为标准. 这种方法的缺点是, 应用程序 初始界面上的中文由于转化了 编码变成了乱码.

2. 中文编码自动识别问题

在文本浏览,网页浏览或网页翻译时, 通常需要自动识别汉字的内码, 但是中文的 GB编码和Big5编码有重叠区域, 所以很难区分开. 目前公开 源代码的识别软件很 少, 识别结果不能令人满意, 远没有达到目前商业软件 的识别水平.

3. Linux上的中文平台到国际化的过渡

但是从长远的角度看, 因为中文在对中文显示和输入上与国际化标准 存在很大差 异, 所以亟需一种从中文平台到国际化标准的过渡性方案. 在 过渡的过程中, 中 文平台可能会和国际化标准共同存在一段时间.

以CLE和TurboLinux为例, 它们在早期的版本中都采用了中文平台来 支持中文的 显示和输入, 随着支持国际化标准的软件的增多, 逐步采用了 中文平台和国际化 标准共同存在的版本作为过渡性版本. 到目前为止, 已经 在缺省情况下放弃中文 平台的使用. 中文平台只是作为残留物包含在发布 版本中.

4. Linux 文档中文化

Linux文档, 主要是指Linux上的一些命令帮助文档(man文件), 软件 手册和说明, 软件本身的Message文件(po). 目前在这方面的工作还缺乏 统一的管理和广大 Linux爱好者的参与.

参考资料

* Unicode: http://www.unicode.org/ * 香港增补字符集: http://www.digital21.gov.hk/chi/hkscs/introduction.html * CJK 有关信息: ftp://ftp.ora.com/pub/examples/nutshell/ujip/doc/cjk.inf * Linux国际化资料: http://i18n.linux.org.tw/ * Linux国际化标准: http://www.li18nux.org/. http:// * MicroSoft 国际化: http://www.microsoft.com/globaldev/

六 附录

1. 宽字符处理函数函数与普通函数对照表

字符分类:

宽字符函数 普通C函数 描述 iswalnum() isalnum() 测试字符是否为数字或字母 iswalpha() isalpha() 测试字符是否是字母 iswcntrl() iscntrl() 测试字符是否是控制符 iswdigit() isdigit() 测试字符是否为数字 iswgraph() isgraph() 测试字符是否是可见字符 iswlower() islower() 测试字符是否是小写字符 iswprint() isprint() 测试字符是否是可打印字符 iswpunct() ispunct() 测试字符是否是标点符号 iswspace() isspace() 测试字符是否是空白符号 iswupper() isupper() 测试字符是否是大写字符 iswxdigit() isxdigit() 测试字符是否是十六进制的数字

大小写转换:

宽字符函数 普通C函数 描述 towlower() tolower() 把字符转换为小写 towupper() toupper() 把字符转换为大写

字符比较:

宽字符函数 普通C函数 描述 wcscoll() strcoll() 比较字符串

日期和时间转换:

宽字符函数 描述 strftime() 根据指定的字符串格式和locale设置格式 化日期和时间 wcsftime() 根据指定的字符串格式和locale设置格式 化日期和时间, 并返回宽字符串 strptime() 根据指定格式把字符串转换为时间值, 是strftime的反过程

打印和扫描字符串:

宽字符函数 描述 fprintf()/fwprintf() 使用vararg参量的格式化输出 fscanf()/fwscanf() 格式化读入 printf() 使用vararg参量的格式化输出到标准输出 scanf() 从标准输入的格式化读入 sprintf()/swprintf() 根据vararg参量表格式化成字符串 sscanf() 以字符串作格式化读入 vfprintf()/vfwprintf() 使用stdarg参量表格式化输出到文件 vprintf() 使用stdarg参量表格式化输出到标准输出 vsprintf()/vswprintf() 格式化stdarg参量表并写到字符串

数字转换:

宽字符函数 普通C函数 描述 wcstod() strtod() 把宽字符的初始部分转换为双精度浮点数 wcstol() strtol() 把宽字符的初始部分转换为长整数 wcstoul() strtoul() 把宽字符的初始部分转换为无符号长整数

多字节字符和宽字符转换及操作:

宽字符函数 描述 mblen() 根据locale的设置确定字符的字节数 mbstowcs() 把多字节字符串转换为宽字符串 mbtowc()/btowc() 把多字节字符转换为宽字符 wcstombs() 把宽字符串转换为多字节字符串 wctomb()/wctob() 把宽字符转换为多字节字符 输入和输出:

宽字符函数 普通C函数 描述 fgetwc() fgetc() 从流中读入一个字符并转换为宽字符 fgetws() fgets() 从流中读入一个字符串并转换为宽字符串 fputwc() fputc() 把宽字符转换为多字节字符并且输出到标 准输出 fputws() fputs() 把宽字符串转换为多字节字符并且输出到 标准输出串 getwc() getc() 从标准输入中读取字符, 并且转换为宽字 符 getwchar() getchar() 从标准输入中读取字符, 并且转换为宽字 符 None gets() 使用fgetws() putwc() putc() 把宽字符转换成多字节字符并且写到标准 输出 putwchar() getchar() 把宽字符转换成多字节字符并且写到标准 输出 None puts() 使用fputws() ungetwc() ungetc() 把一个宽字符放回到输入流中

字符串操作:

宽字符函数 普通C函数 描述 wcscat() strcat() 把一个字符串接到另一个字符串的尾部 wcsncat() strncat() 类似于wcscat(), 而且指定粘接字符串的 粘接长度. wcschr() strchr() 查找子字符串的第一个位置 wcsrchr() strrchr() 从尾部开始查找子字符串出现的第一个位 置 wcspbrk() strpbrk() 从一字符字符串中查找另一字符串中任何 一个字符第一次出现的位置 wcswcs()/wcsstr() strchr() 在一字符串中查找另一字符串第一次出现 的位置 wcscspn() strcspn() 返回不包含第二个字符串的的初始数目 wcsspn() strspn() 返回包含第二个字符串的初始数目 wcscpy() strcpy() 拷贝字符串 wcsncpy() strncpy() 类似于wcscpy(), 同时指定拷贝的数目 wcscmp() strcmp() 比较两个宽字符串 wcsncmp() strncmp() 类似于wcscmp(), 还要指定比较字符字符 串的数目 wcslen() strlen() 获得宽字符串的数目

wcstok() strtok() 根据标示符把宽字符串分解成一系列字符 串 wcswidth() None 获得宽字符串的宽度 wcwidth() None 获得宽字符的宽度

另外还有对应于memory操作的 wmemcpy(), wmemchr(), wmemcmp(), wmemmove(), wmemset(). 2. X 窗口系统下支持中文的函数

支持西文的函数 支持中文的函数 描述 XLoadFont XCreateFontSet 载入字体集

XTextExtents(16) Xmb/wcTextExtents 返回文本的限制框 Xmb/wcTextPerCharExtents XDrawString Xmb/wcDrawString 在窗口中画字符串, 背景填充 XDrawImageString Xmb/wcDrawImageString 在窗口中画字符串 XDrawText Xmb/wcDrawText 在窗口中画字符串 XLookupString Xmb/wcLookupString 查找字符串

3. 支持国际化的高层库 o OSF/Motif o Qt/kdelib o gtk+/gnome-lib o Perl o Java 4. 支持多语言的典型软件 o 浏览器 Netscape o 编辑器 XEmacs o 编辑器 Mule o 编辑器 vim o 终端 rxvt o 排版软件 LaTeX/lyx o PostScript/PDF: gs/acroread o 图像处理: gimp o 幻灯片制作 mgp o 即将完成: StarOffice, KOffice 5. 支持Unicode的软件 o 高级图形库函数 Qt 2.x o Java 语言开发工具 JDK o 编辑器 yudit o 专用的支持Unicode的 X 终端 o 基于GTK+的文本处理器 GScript

(全文完)

相关链接: Linux 国际化本地化和中文化(四)