初始化NLS代码表。
#124 /* Initialize the NLS Tables */
#125 RtlInitNlsTables((PVOID)((ULONG_PTR)ExpNlsTableBase +
#126 ExpAnsiCodePageDataOffset),
#127 (PVOID)((ULONG_PTR)ExpNlsTableBase +
#128 ExpOemCodePageDataOffset),
#129 (PVOID)((ULONG_PTR)ExpNlsTableBase +
#130 ExpUnicodeCaseTableDataOffset),
#131 &ExpNlsTableInfo);
#132 RtlResetRtlTranslations(&ExpNlsTableInfo);
NLS是什么呢?其实NLS就是National Language Support,国家语言支持。现在是全球化的时代,开发每一款软件都需要考虑到全球市场,这样就需要定制不同的国家语言支持。下面来了解NLS的由来和应用:
NLS 的发展背景
Unix 是在发展于美国的操作系统, 所使用的文字也一直是英文为主的ASCII 码; 国际化 (internationalization) 及本土化 (localization) 的需求从未考虑过。在问世二十多年后的今天, Unix 遍布全世界, 提供一个界面让使用者能用他们自己的语言(1), 而不只是英文, 来和应用程序沟通, 已是十分重要的课题了。于是, 就有了 NLS 的诞生, 以 实现 Unix 及应用软件的国际化及本土化的目标。
什么是 NLS ?
NLS (National Language Support) 是一个附加于 Unix 上的子系统 (subsystem), 其目的就是使传统的 Unix 系统及其上的应用程序, 能够不拘限于某一种语言, 和使用者所使用的语言独立( language independent)。NLS 能使程序开发人员撰写出来的程序, 很有弹性地在不同使用不同的语言环境下都可使用。程序只须撰写、编译一次, 同一个可执行程序会根据使用者的语言不同, 在执行时 (run-time) 自动改变所使用的字码集、显 示信息、文字处理能力等等, 让使用者可以自己熟悉的语言和应用程序沟通。在过去以及现在, 某一软件都是为某一种语文或字码集 (如英文 ASCII 码, 中文 BIG5 码等等) 所写; 如要在别种语言环境下使用时, 常常就必须重写。而未来使用 NLS 后, 应可避免此一情况。
为什么需要中文 NLS ?
因为中文文字的特性, 处理中文资料的软件会因为所使用中文内码的不同而必须使用不同的软件, 如同不同国家的使用不同的语文一般。 由于中文文字的特性, 一个字须用 2 到 4 的 byte 来表示其内码值。许多既有的英文版软件为了能处理中文, 不但须修改成具多位文字的处理能力, 而往往更改后的版本, 若不是功能上相较之下有瑕疵, 即 是中文版本较英文版为旧。再者就是: 中文内码的种类繁多, 如同不同国家民族使用不同语言般歧异。当软件针对某一内码开发后, 如要在他种内码下使用时, 重写所需之工夫, 往往并不亚于自英文版改至中文版。为了不同内码必须开发不同之版本, 也使得中文的资料及程序的重覆使用特性 (reusability)大为降低。甚至会有某些中文内码环境无类似软件可用之情形产生。
如果利用 NLS 技术, 使得单一版本的软件即可适用于多种中文内码的环境; 不需要因语言、字节宽度、编码方式等等不同而修改或重新编译程式。如此可使中文软件不须因中文内码环境之不同开发不同版本,以节省成本及提高程序和资料的重复使用性。同时也可使许多英文软件改成中文版的移植较为容易。
NLS 涵盖那些部份 ?
NLS 主要包含了一C语言的程序库、工具程序, 以及一种新程序写作观念 (programming style)。在概念上, NLS 包含了下面三部份 :
.一个和语言独立 (language dependent) 的程序 : 和使用者所使
用的语言言依赖(language dependent) 的部份并不是 hard code
在应用程序内, 而是由 NLS 函数内部来处理。
.Message catalogs : 应用程序所显示的信息均不硬编码在程序中, 而是以外部文件的方式储存。当在不同的语言环境下使用时,会自动地选择相对应的文件。
.Language Tables : 所有和语言(或内码)相关的信息, 均以表格的方式储存。应用程式在执行时依据使用者设定的语言环境变数, 读取相对应的语言表。而 NLS 的函数及工具程序, 可依照上述概念, 分为 :
. 宽字节 (wide character) 及相关处理函数:
NLS 定义了一种新的资料型态: 宽字节。传统的 C 语言中, 通常都是使用 char 资料类型来储存字节(character)。 char 通常是定义成一个 byte 的大小, 因此一个如英文字母的字节只须一个 char 的空间就足以表达 ; 但是中文字至少须要 2 至 4 个 char 才能表 示其内码值, 所以储存一个中文字须要数个 byte 的空间才够。也使得一个中文字不是以一个整体的文字, 而是零散的数个 byte (char) 的组合。宽字节则是打破此一限制及观念 : 它是一种新的用来表示单一或多位元组字节的内部类型。它的大小大于一个 byte, 通常是定义成四个 byte 宽, 以保证一个宽字节就足以表达一个语言所有的文字。中文字不须要再以两个或四个 byte ( char ) 来表示一个中文字。不论是一个中文字或一个英文字母, 都是以一个宽字节表示。如此在内部处理上, 可以大大减低了因为中英文字(母)所占的 byte 数不同而造成的困扰。除了宽字节的类型外, 另有相当多的宽字节与多位节组字节转换的函数, 宽字节的输出入函数, 字串函数, 及字节处理、内码转换等函数。
.Message Catalog : 提供函数使应用程序可以在执行时读入相对应的讯息档。
.Language Table : 提供工具程序来建立包含语言特性的语言表, 以供应用程序在执行时使用。
.其他 : 其他另有函数, 来处理日期, 货币、时间等格式之间的转换。