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

  • 数字、日期及时间

  • 货币及符号

  • 键盘布局和使用

  • 排序方法

  • 图标、颜色、字体

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

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

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

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-32、UTF-16 和 UTF-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 会让你的软件更容易走向 国际市场。