L10n 是英文单词 Localization 的缩写,其中数字 10 是指首字母 L 和末字母 n 之间有10个字母。所以,L10n 就是本地化的意思。就软件来说,大家通常理解的本 地化就是用户界面和文档的翻译;其实不然,本地化有时候非常复杂,它包括

  • 数字、日期及时间

  • 货币及符号

  • 键盘布局和使用

  • 排序方法

  • 图标、颜色、字体

等等,还常常涉及风俗文化和道德法律的考虑。本地化对软件的用户界面设计、业务逻辑安 排和呈现规范都是考验,软件本地化的资源投入不仅仅是文字翻译。

I18n 类似,是 Internationalization 的缩写,是指国际化。就软件来说,国际化就 是在软件设计时充分考虑其对本地化的友好性——让软件更容易本地化,更容易推广到国际市 场。简单来说,软件国际化不是在需要国际化时再考虑的事情,而是在软件设计之初就要考 虑清楚的事情。

一般来说,软件的国际化通常涉及到代码级的改动。如果国际化设计得好,那么软件的本地 化不会涉及到代码的变化,通常提供资源文件的本地化就可以了。无论进行本地化,还是要 设计国际化,非常重要的问题就是要考虑对各种字符的支持——现在的标准是一律支持 Unicode。许多中文软件支持的是 GB2312GBKGB18030,这在进行国际化时就 要注意。

Unicode 的历史已经超过 30 年了。大多数的操作系统、网络协议、网络浏览器和大量的 编程语言都支持 Unicode。它的编码也涵盖了几乎所有的其他字符编码。就最新的 Unicode 13.0.0 来说,它有 143,859 个字符、154 种文字和 3304 个表情符号。 Unicode 还包括可以和其他字符组合的字符,如音调字符 ◌̀ 等。但是,Unicode 不仅 仅是一个字符集,它还包括了标准编码格式——UTF-8,它定义了大小写字符的对应关系、排 序、换行规则、显示解析以及从右向左类文字的处理方法等。可以说 Unicode 是适应全 球语言文字的大集合。

然而,在软件中处理 Unicode 并不简单,有许多细节需要考虑。下面是一些常规要做的 事情。

  • Unicode 规范化

有时候,某些看起来一样的字符,实际上是好几个 Unicode 字符组合而成的。为了保持 编码和解码的一致性,软件需要对要使用的字符集进行 Unicode 规范化。许多编程语言 都提供了专门的 Uincode::Normalize 库,程序员要注意的就是整个软件的规范化规则要 保持一致。

  • 大小写转换

由于涉及多种语言和多种规则,Unicode 的大小写转换并不简单。比如德语的小写字母 ß 的大写是两个字母 SS。请使用编程语言提供的 Unicode 大小写支持库,比如 Unicode::Casefold

  • 排序

和大小写转换类似,排序也和语言种类密切相关。比如,中文就有很多种排序方法,拼音排 序、笔画排序等。Unicode 本身的字符排序并没有特别的意义,但是它明确了排序的算法, 使得许多语言能够实现快速全面的按语言排序规则,比如 Unicode::Collate:Locale 类 库。

  • 编码

Unicode 主要有三种编码方式:UTF-32UTF-16UTF-8

UTF-32 虽然简单统一,但是占用空间太多,所以用得较少。

UTF-16 使用 2 字节(16 位)表示最常用的字符,使用 4 字节表示不常用的字符。 Java、.NET 和 Windows 使用 UTF-16

UTF-8 最常用,尤其是在网络上。由于它兼容 ASCII,所以许多旧式的只支持 ASCII 的 程序在 UTF-8 编码环境下也可以正常使用。但是,要注意这些程序处理 UTF-8 数据时 可能会出错。

  • 文件系统

当你使用 Unicode 作为文件名或文件夹名称的时候,你经常会遇到麻烦。因为,系统编 码可能不一致,所用的文件访问 API 可能使用不同的编码。你所能做的就是查看相关系统 的文档并不断测试自己的代码,确保文件访问没有问题。

  • 国际化域名

当域名使用不同的文字时,尽管使用的是 Unicode,程序处理也非常复杂。因此,国际化 域名可以使用的字符也有很多限制。DNS 本身不支持超出 ASCII 字符的域名,所以国际化 域名要转换成为 ASCII 字符的域名,这里使用的标准方法是 Punycode——所有国际化域名 都以 xn-- 开头。比如,.中国 就会变成 xn--fiqs8s

以上只是列出了使用 Unicode 进行国际化和本地化的常见问题。具体应用还会遇到多得 多的问题,相信其中大多数都在 Unicode 的框架下有了解决方案。编程人员所要做的就 是具体化问题,阅读相关文档,不断测试。坚持使用 Unicode 会让你的软件更容易走向 国际市场。