I18N还是L10N

来源:百度文库 编辑:神马文学网 时间:2024/04/28 05:37:20
无论是I18N还是L10N,从技术角度简单地说,其本质上都是字符编码的问题。
http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.i18nfaq.com/以FAQ的形式,对I18N和L10N做一些解释,并提供了一些工具,对遇到字符编码难题的朋友,也许会有一些价值。下面是对网站一些文章的学习笔记。
三个概念
I18N 即internationalization,软件国际化。一个过程,通过修改代码实现代码的文化独立性,即代码不依赖于任何特定文化的信息(cultural specific information)。
L10N 即localization,软件本地化。一个过程,为每一种支持的人类语言来定制软件。
Code Page 即所谓代码页,它是一个字符和数值进行映射的表。
 
一些资源
资源 备注信息
语言类 Java Tutorial http://java.sun.com/docs/books/tutorial/i18n/ FAQ http://www.sun.com/developers/gadc/faq/java/
C/C++(Unix) POSIX Locale http://www.opengroup.org/onlinepubs/007904975/basedefs/xbd_chap07.html International Components for Unicode (ICU) http://oss.software.ibm.com/icu/
VC++(WIN) http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/nls_9w2t.asp
Perl http://rf.net/~james/perli18n.html
JavaScript http://groups.yahoo.com/group/i18n-prog/message/32 http://groups.yahoo.com/group/i18n-prog/message/37
VB http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon98/html/vbconinternationalissues.asp
JSP http://jakarta.apache.org/taglibs/doc/i18n-doc/intro.html
ASP http://msdn.microsoft.com/msdnmag/issues/0700/localize/default.aspx
PHP http://news.php.net/group.php?group=php.i18n
标志语言 HTML http://w4.systranlinks.com/config http://w4.systranlinks.com/config Altavista machine translation http://world.altavista.com/ Google machine translation. http://www.google.com/language_tools?hl=en
XML http://www.opentag.com/xmli18nfaq.htm
数据库 ORACLE http://technet.oracle.com/products/oracle8i/htdocs/faq_combined.htm
Sybase http://my.sybase.com/detail?id=1009199
Informix
M$SQL
MYSQL http://scarab.tigris.org/mysql-internationalization.html
操作系统 Unix locale -a ;locale ;locale -ck d_t_fmt
NT http://www.microsoft.com/globaldev/default.asp Start=>Settings=>Control Panel=>Regional settings. HKEY_CURRENT_USER=>ControlPanel=>International=>*
 
继续学习I18N。
什么是”I18N"?
I18N就是Internationalization(该单词的首字母I与尾字母N中间隔着18个字符)。它是一个代码修改的过程,目的是实现代码完全独立于任何特定的文化信息。这类信息保存在外部文件里,在程序运行的时候被装入。有些人可能想,只要把程序中所有特定文化有关的字符串(hard-coded strings)都抽取出来放在外部的文件中,就已为国际化做好准备了。其实,除了这个,还有一些事情需要考虑,主要包括:
将字符串、图标、图片从程序中抽取出来,以文本的形式表示
选择编码页(code page),如果需要并定义编码页转换
修改所有的文本处理函数,以适应代码页的引入
修改所有与格式化输出有关的函数(如日期、时间、货币、数值等)的实现逻辑
修改整理/排除函数的实现逻辑
 
什么是编码页(code page)?
正如我们所知,计算机只懂得数值。因此,当我们想要它处理文本时,就把一门语言中每个字符都赋以特定的值。简单地说来,这种字符与数值的对照表就叫编码页。在这种情况下,你可能常会听到诸如字符集(charset),字符表(charmap),编码(encoding),编码字符集(coded character set)等术语。虽然彼此间还有一些细微的差异,为理解的目的你可以认为它们都是指每种语言的字符、数值映射表。ASCII编码页就是一个很著名的例子,它把英文字母表和一些控制字符映射到一些特定的数值上去。
 
还有哪些编码页?围绕着编码页有哪些问题?
ASCII编码映射了127个字符,因此7位(bit)二进制数足够用来表示127个字符。程序则典型地在8位的缓冲区内处理文本。这在处理其它的语言的编码页是会出问题。例如日语这种语言,有成千让万个字符,8位二制只能表示256个不同的字符,不可能唯一地表示每一个日语字符。因此,人们用几个字节来表示一个日语字符。现在,我们又遇到另一个问题。缓冲区的字节数不等于缓冲区中的字符数。每一个简单地字符串操作,都需要将字节组装成字符。
认识到这种复杂性,开发人员利用一种叫宽字符(wide-character)的技术来处理外语字符串。宽字符基本上是16位或32位的数据类型。容量够大,能满足亚洲语言的需求。处理字符串不再使用8位的缓冲区(char *),而是使用16位的缓冲(unsigned short *)。因此每次移动指针,你都可以保证跳过了一个字符(而不是原先那可能是半个)。
不同的开发商使用不同的编码页,给这带来了混乱。也就是说,同一个日语字符,在一个机器上可能用0x95和0x5c两个字节表示,而在另外的机器的上则可能是0xc9和0xbd。这样一事每次交换数据都要进行一次转换(称为码表转换(charmap conversion)或码集转换(codeset conversion))。
什么是Unicode?它是如何解决这个问题的?
每一种语言的不同的编码页,增加了那些需要支持不同语言的软件的复杂度。因而人们制定了一个世界标准,叫做unicode(http://www.unicode.org).Unicode为每个字符提供了唯一的特定数值,不论在什么平台上、不论在什么软件中,也不论什么语言。也就是说,它世界上使用的所有字符都列出来,并给每一个字符一个唯一特定数值。
什么是UTF-8?它与UNICODE是一回事吗?
Unicode的最初目标,是用1个16位的编码来为超过65000字符提供映射。但这还不够,它不能覆盖全部历史上的文字,也不能解决传输的问题(implantation head-ache‘s),尤其在那些基于网络的应用中。已有的软件必须做大量的工作来程序16位的数据。
因此,Unicode用一些基本的保留字符制定了三套编码方式。它们分别是UTF-8,UTF-16和UTF-32。正如名字所示,在UTF-8中,字符是以8位序列来编码的,用一个或几个字节来表示一个字符。这种方式的最大好处,是UTF-8保留了ASCII字符的编码做为它的一部分,例如,在UTF-8和ASCII中,“A”的编码都是0x41.
UTF-16和UTF-32分别是Unicode的16位和32位编码方式。考虑到最初的目的,通常说的Unicode就是指UTF-16。在讨论Unicode时,搞清楚哪种编码方式非常重要。Unicdoe相关的技术介绍参见http://www.unicode.org/unicode/standard/principles.html.
通常说的”特定文化信息(cultural specific information)”包含哪些内容?
特定文化有关的字符串(hard-coded strings),程序中不能包含与特定文化有关的任何字符串,这类串都要放在外部文件中,从而能译成多种语言。
字符分类(character classification) 如何对字符进行分类呢?例如,英文中可以将字符分为大写字符和小写字符,如果你是个C程序员,则可以用isupper()和islower()来检查。当面临多种语言时,需要考虑更多分类方法,有时候大小写分类法在某些语言中没有任何意义。
数值和货币格式 货币符号,以及将数值中数位分组的方式,每个国家各不相同。
日期和时间格式 年、月、日哪个写在最前面?
整理/排序 如果比较字符”A”和“B”,你可以实际比较它们的ASCII值来决定它们的顺序。但是,在不同的编码页可能并不如此。因此必须用特殊的规则来决定字符顺序。