国际化的含义
国际化是一种将程序代码变得更通用、更灵活的过程,进而可以轻松地适应来自全球的市场规范。这些规范包括但不限于字符集、日期/时间格式和货币符号。如果读者已经对国际化、本地化以及字符编码等问题有所了解,则可以直接跳到开发本地化的项目主题中。
国际化支持本地化开发,即开发特定语言环境(包括地理、政治或文化区域)的用户界面。语言环境通常使用由两个字母的 ISO-639-2 语言代码和两个字母的 ISO-3166 国家/地区代码所构成的代码来标识。例如,en_US 表示语言环境为“英语(美国)”。在某些情况下,只提供语言标识符。
利用 Sun Java Studio Creator 应用程序开发工具 (IDE),您可以创建程序的本地化版本,其中每个本地化版本都支持一种目标语言环境。此外,它还可以生成国际化代码,这样您的程序就可以成为支持不同语言环境的本地化应用程序。
语言环境、字符集和编码字符编码问题并不是开发国际化应用程序中所特有的问题,即使开发者开发的应用程序不显示特定于某个语言环境的消息,但是如果要在此特定的语言环境中运行该应用程序,那么每一位开发者都会面临这样的问题。假如不了解字符编码,则难以理解国际化的过程。
正如上面所述,语言环境通常使用由两个字母的语言代码和两个字母的国家/地区代码所构成的代码来标识。每种语言(在某些情况下,是每种语言环境)可能需要使用不同的字符集。字符集是语言中使用的文字标记符号(字母、数字和标点符号)的集合。欧洲语言的字符集比较小,只有几百个文字标记符号。而其他语言环境,特别是亚洲语言环境,字符集包含几万个文字标记符号。
字符编码是对字符集中文字标记符号的代码点映射,且以整数来表示。代码点和符号之间的映射通常是由诸如国际标准化组织 (International Standards Organization,ISO) 之类的标准委员会来制订。编码也可以由那些要定义自己特殊文字标记符号的制造商来定义。具有较大字符集的语言环境要求使用至少两个字节(16 位)的代码点来表示所有的文字标记符号,而且目前有效的可变字节长度的编码方案最多使用 6 个字节来表示某些文字标记符号。
任何一种语言都可以具有多种编码。并且两种不同的字符编码可以提供相同的字符集,只是它们的代码点会引用不同的文字标记符号。有时,容易给人们造成混淆的是:同一编码还会有多个名称。要了解有关编码的更多信息,您可以通过 ISO Web 站点获取一些资料。
Unicode 和 UTF-8Unicode 作为一项国际标准,其目标在于指定一种代码,该代码可以将每种编写的用户语言所需要的每个字符映射到一个唯一的整数代码点上。尽管存在着各种困难,但 Unicode 已成为多语言环境中的主要编码方案。 Java Studio Creator IDE 缺省情况下使用 UTF-8 编码(8 位 Unicode 传输格式),这种编码目前是灵活实现 Unicode 标准的最佳方式。它是一种无损的、可变长度的字符编码,使用字节组来表示世界上众多语言字母表的 Unicode 标准。它是 XML 格式的缺省编码。
UTF-8 使用 1 至 4 个字节来表示每个字符,具体字节数取决于 Unicode 符号。例如,对于 128 个 US-ASCII 字符进行编码时,每个字符只需要一个 UTF-8 字节。用 UTF-8 编码的 ASCII 文件与原始 ASCII 文件完全相同。对于所有非 ASCII 的字符来说,采用 UTF-8 编码后将拥有很多的有效位数,而 ASCII 字符经 UTF-8 编码后则不然。这意味着:用于处理 ASCII 文本的现有工具(搜索、文本编辑等)仍可以按预期方式工作,而旧系统(如电子邮件程序)可以传输 UTF-8 编码的内容。
UTF-8 可保证一个字符的字节序列不会包含在另一字符的字节序列(相对较长)中。这样就确保了可以采用以字节为单位的子字符来搜索文本内的单词或短语。其他大部分的可变长度 8 位编码不具有此属性,因此难以进行字符串匹配。 IDE 中的语言环境设置和字符编码
Java Studio Creator IDE 允许您使用若干种方法来控制语言环境和字符编码。正如前面所论述的那样,语言环境和字符编码是不同的设置。但是,由于字体的可用性,您通常会发现这两个设置之间存在着关联。
注意:设计字样的目的在于让一组字母、数字和特殊符号共享特定的外观,例如 Helvetica 或 Times Roman 字样。字体则是字样字符集的实现。在以前,字体是通过硬件表示的。然而,新型的字体(通常是动态生成的)是由与操作系统关联的软件提供的。
作为开发者,您必须有意识地考虑用于支持应用程序的目标平台和字符编码。对于 Web 应用程序来说,支持开发工作的目标平台既不是计算机,也不是操作系统,而是 Web 浏览器。而常见的浏览器又是针对若干个操作系统来起作用的。由于字体是随操作系统而分发的,因此常见的浏览器必须能够处理每个系统的可用字符编码。新型的浏览器可以处理多种不同的字体编码。
在 Java Studio Creator IDE 中,您通常会选择一种特定的字符编码,例如,将语言环境指定为 ja_JP 时选择 Shift_JIS 编码;或者指定繁体中文语言环境(如 zh_TW)时选择 Big5 编码。
浏览器提供了首选项设置,用以通知国际化站点有关用户的首选语言设置。收到此信息的 Web 服务器会尝试以客户端浏览器的首选语言来提供页面服务。
指定字符编码以及语言环境是非常重要的,因为并非特定语言的所有编码都是相同的。例如,请参看图 1,该图提供了在同一浏览器中使用三种不同的编码所显示的中文文本样例。每种情况的编码都是响应编码,即,对 Web 服务器构建页面并将其发送到客户端浏览器时所指定编码的响应。例如,当浏览器收到采用 UTF-8 编码指定的页面时,它将尝试使用其 UTF-8 字体呈现该页面。
图 1 中圈出的字符表明:UTF-8、Big5 和 GB2312 在同一浏览器上显示时会有很大的差异。GB2312 编码通常在中国大陆使用;而 Big5 则在中国台湾地区使用。
在 Big5 编码样例底部,有一个字符代码根本无法呈现为中文文本标记符号,这说明此部分的内容很可能需要使用 GB2312(简体中文)编码。在这个示例中,使用 UTF-8 编码的字体与使用 Big5 的字体是类似的,尽管不同的标点符号间距造成了不同的换行。 不同的浏览器可能会有不同的操作方式,因此情况会变得更为复杂。出于这种原因,一些 Web 应用程序(尤其是适用中文环境的应用程序)允许用户选择编码。
开发本地化的项目利用 Java Studio Creator IDE,您可以开发基于 Web 且支持多语言的应用程序。如果要在开发基于 Web 且支持特定语言的应用程序的同时成功地进行部署和测试,则必须在与目标计算机(计划在其上运行服务器)具有相同字符编码的开发计算机上启动 IDE。
同时,浏览器还必须支持目标语言。当您开发应用程序时,所有的 JavaServer Pages (JSP) 文件和 Java 源文件都可能以操作系统的本机编码进行维护,许多其他常见的 IDE 也是如此。此功能使得开发者可以将 IDE 与其他工具交替使用。或者,您可以选择采用 UTF-8 编码来存储所有的 JSP 和 Java 源文件。如果您需要在分布于全球的开发团队中共享文件,则使用 UTF-8 编码可以避免出现编码问题。在这种情况下,您可以维护一个中心源代码库,因为用于编写文件的操作系统编码在不同的语言环境之间没有差异。
此外,您可以通过将环境设置为使用 UTF-8 编码,在单个的 JSP 页中使用多种语言。但是,此选项仅在支持 UTF-8 字体的平台上可用。
要想完全可靠地更改虚拟机和运行时系统使用的缺省编码,方法只有一种,那就是在启动 IDE 之前,必须更改基层操作系统的语言环境。例如,在 Windows XP Professional 中,通过控制面板的“区域和语言选项”来设置语言环境。
如果您在启动 IDE 后更改项目的编码或语言环境,则项目 JSP 和 Java 文件中的文本或语言指令有可能会中断同步连接。结果可能会导致应用程序遭到损坏。要进行恢复,请重新检查项目,确保所有的 Java 文件使用相同的源编码,并且所有存在的 JSP 标记与项目的缺省语言和语言环境编码设置完全一致。有关详细信息,请参见更改现有项目中的源编码部分。
IDE 中的国际化功能
要创建国际化应用程序,您必须对语言环境和字符编码参数进行管理。您可以使用 IDE 来管理字符编码和语言环境,这主要是通过 IDE 的一组编码属性和选项来实现的。
尽管人们迫切需要像 UTF-8 这样的标准化单一编码(能够很好地适应以 ASCII 为中心的程序),但是由于一些平台无法处理 UTF-8,或者由于一些固有的文化环境和传统要求,现有的技术状态仍无法完全采用 UTF-8 编码。通常,建议所有的语言编码都采用 UTF-8 编码,但简体中文除外,这是因为其他类似 GB2312 这样的编码已占据了主导优势。因此,您可能需要更改缺省行为。
本教程的其余部分将介绍 IDE 中影响本地化和国际化的功能、属性及选项。
源编码设置
源编码设置用于确定项目的源文件(
.jsp 和 .java 文件)的字符编码。这些设置会在源文件中生成标头和标记,以便文件的阅读器可以正确地解释它们。
缺省的源编码选项
“缺省编码”选项为新的项目源文件设置缺省编码。如果您不输入该选项的值,则 IDE 将基于计算机的当前语言环境和编码设置来使用源编码。该选项的值可以被单个源文件中的属性所覆盖。
要更改缺省源编码,请从菜单栏中选择“工具”>“选项”,然后单击“高级”单选按钮(请参见图 2)。选择“Java 源代码”选项,如果需要,请展开“专家”类别以显示“缺省编码”选项。
如果该选项值为空,则 IDE 使用的是缺省系统编码。要更改编码,请在“缺省编码”属性右侧的值字段中单击,然后输入您选择的编码。或者,单击值字段旁边的按钮,然后在出现的对话框中输入编码。
单个的 Java 源文件编码
在 Java 编辑器中编辑 Java 源文件或者在“项目”或“文件”窗口中选择其名称时,“属性”窗口将显示该文件的“文本”>“编码”属性(请参见图 3)。这是单个 Java 文件的源编码。如果没有为此属性输入任何值,则 IDE 将使用页面的“缺省编码”选项。
要更改“编码”属性,请单击属性右侧的按钮,然后输入其他编码,如 UTF-8 或 Shift_JIS。
如果需要更改文件的源编码属性,则新的编码将在保存项目后才会生效。如果您放弃了更改,则该属性将一直保留在“属性”窗口中,但是保存文件时将不会采用新编码。必须通过使用新编码来保存文件,这样在下次使用该文件时它才具有新编码。如果文件尚未发生更改,请稍做编辑以便可以保存该文件。例如,先添加一个字符再将其删除,这样文件便可以进行保存。
如果更改 Java 源文件的编码,则必须更改与之匹配的其他现有 Java 文件。所有 Java 文件会同时传递到编译器中,而编译器只能接受一种编码标志。因此,在每次生成时,所有的 Java 源文件都必须使用相同的编码。要保持源文件中的各种设置同步,请对每个文件执行操作(先添加一个字符再将其删除)并保存项目。
如果 Java 源代码包含了固定编码的字符串,则在您更改源文件的编码并进行保存时,这些字符串的编码会发生更改。因此,如果您最初使用了 UTF-8 编码,然后将编码更改为 Shift_JIS,则 IDE 将在您用新编码保存文件时转换该文件。固定编码的字符串将以新的编码正确地显示给用户。
项目的“缺省编码”属性用于确定新源文件的编码。但是,如果您在启动 IDE 后更改项目的属性,则现有的源文件将保持其原始编码。此外,还应更改 Java 文件的文本编码,使之与新的“缺省编码”属性相匹配。
同样,如果更改了现有 Java 文件的编码,则应该更改与之匹配的缺省源编码属性,这样新文件将会与之保持同步。
更改现有项目的源编码:
支持的语言环境
可以在 faces-config.xml 文件中设置应用程序支持的语言环境。通过查看项目的“文件”窗口,然后展开 "<项目名称>" > "web" > "WEB-INF" 节点,则可以查看或编辑此文件。有关详细信息,请参见 faces-config.xml 文件。
此外,为了让应用程序能够在所希望的语言环境中正常显示,您可以将本地化的字符串添加到项目的资源绑定中。资源绑定将每种语言环境的选定特性以键值对的形式存储在属性文件中,通常一个文件对应于一种语言环境。属性文件用于存储本地化的字符串。
当某一页面显示在可视设计器中时,可以看到属性文件。在“文件”窗口中,可能通过展开 "<项目名称>" > "src" > "<项目名称>" > "
bundle.properties" 节点来查看这些文件。在“项目”窗口中,可以通过展开 "<项目名称>" >“源包”> "<项目名称>" > "bundle.properties" 节点来查看这些文件。在绑定的属性部分中对绑定的属性文件进行了说明。编码组件
“编码”组件可用来动态设置应用程序中页面的语言环境。该组件位于“组件面板”>“高级”>“编码”中。缺省情况下,编码组件通过应用程序 Bean 来获取编码。其工作方式如下:
缺省的语言环境和响应编码
现在,您将了解 Web 应用程序是如何针对客户端浏览器请求的特定语言环境来作出响应。
如果浏览器请求了一种应用程序可以支持的语言环境,则 Web 应用程序就会显示按照请求的语言环境生成的页面,以此来作为响应。如果 Web 应用程序不支持请求的语言环境,则它将通过应用程序 Bean 中的
localeCharacterEncoding 属性所指定的语言环境来生成 Web 页,以此来作为响应。
例如,如果用户的 Web 浏览器请求的是俄文语言环境,则应用程序将使用
bundle_ru_RU.properties 文件而不是缺省的 bundle.properties 文件生成该用户的 Web 页。在绑定的属性部分中对绑定的属性文件进行了说明。
响应编码属性是应用服务器在对浏览器请求作出响应时使用的缺省字符编码。其值是一个代码,用于指定在页面中使用的字符编码。字符编码是通过提交的页面标头中 HTTP Content-Type 标记的 charset 参数来表示的。如果浏览器请求的是其他语言环境,则使用该语言环境的响应编码(如有可能)。
当客户端浏览器通过 Web 应用程序请求页面时,应用程序的缺省响应如下:
客户端浏览器可以通过请求特定的语言(例如,俄文)来尝试覆盖缺省的响应编码。Web 应用程序会接受该请求,请注意可以在 UTF-8 编码的 Web 应用程序中使用俄文,然后使用俄文资源绑定的字符串元素来传送以 UTF-8 编码表示的页面。
或者,您可能已决定将应用程序的俄文响应编码指定为 KOI8-R(这是一个在俄罗斯仍然流行的编码)。在这种情况下,您的应用程序会将 JSP 文件转换为 Unicode 格式并存储在内存中,然后将其中间表示转换为 KOI8-R 并传送页面。客户端浏览器将使用俄文来显示页面,并接受用户以 KOI8-R 编码执行的输入操作。当用户提交页面时,客户端浏览器将包含一个标头,用于向 Web 服务器通知:该页面采用 KOI8-R 进行编码,这样服务器就可以解释请求了。
每个请求和响应都与编码相关联。如果客户端浏览器不发送编码规范,则应用服务器会假定请求与其最近发送的响应使用的是相同的编码。
您可以更改 IDE 项目中单个 JSP 文件的响应编码。
UrlLang 属性urlLang 属性适用于链接组件“超级链接”和“图像超级链接”。它用于指定这些组件的 url 属性引用的资源中所使用的语言。在呈现的页面中,该属性表示为 HTML <a> 标记中的 hreflang 属性。
Lang 属性lang 属性用于指定在为网格面板组件生成的标记中使用的语言。当您在可视设计器中选中一个“网格面板”组件时,便可以在“属性”窗口中看到该属性。
lang 属性表示为 HTML <a href> 标记中的 lang 属性。此属性用于指定由链接指派的资源的字符编码。它旨在让用户代理基于给定语言的普遍适用的文化惯例有效地呈现内容。它可用来声明 Web 页或 Web 页某一部分的语言。单击属性旁边的按钮将会打开图 8 和 9 所示的相同的属性编辑器。
语言属性语言属性与应用程序的每个 JSP 页相关联。该属性用于指定在为页面生成的标记中使用的语言。它表示为 HTML <head> 标记的 lang 属性。要更改属性值,请在可视设计器中显示页面,然后在“属性”窗口中查看该页面的属性。单击“高级”>“语言”属性旁边的省略号按钮 (...)。
如果页面上组件的 lang 属性设置与此设置不同,则会为该组件应用此语言属性的值。
Charset 属性charset 属性与链接组件(如超级链接组件)的 url 属性相关联,它用于指定作为链接目标的文档或资源的字符编码。在呈现页面时,它表示为 HTML <a> 标记的 charset 属性。有关编码列表,请参阅 http://www.iana.org/assignments/character-sets。
严格地来讲,字符集不是编码;但是 HTML 规范已使用编码属性来表示 charset 名称了。
查看属性:
更改
charset 属性:
您指定的编码已表明了链接的目标编码。这种提示有助于浏览器作出相应地链接。 图 8 显示的对话框中的列表是由 W3C 定义的、正式发布使用的所有字符编码列表。但是,该列表可能不完整,因为它可能未包含每个编码的所有已知的别名。
添加新编码
由于某些专用的编码可能未在此列表中列出,您可以通过单击对话框中的“新建”按钮进行添加。某些组织为了在某些特殊的地方显示特殊的字符,有时也会开发一些专用编码。此类站点通常会提示用户首先下载专用的字体包和编码,然后才能查看站点。
Hreflang 属性hreflang 属性适用于“标准”链接组件。其使用和编辑方法与“基本”和“高级”链接组件的 urlLang 属性相同。新项目中应该避免使用“标准”组件。
Dir 属性dir 属性适用于包含文本显示或文本输入组件的布局组件。要查看该属性,请在可视设计器中选中“网格面板”组件,然后在“属性”窗口的“高级”类别中查找。
dir 属性用于表示文本的读写方向,当文本未继承正确的读写方向(例如,由于文本为英文,但页面的主语言为希伯来语)时它是非常有用的。在呈现的页面中,该属性表示为 HTML <input> 标记的 dir 属性。严格地来讲,此属性不是语言编码的一部分。但是,它可控制字母的显示方式。
该属性值可以属于下面某个值:
绑定的属性
可以通过指定单个的语言环境和编码,或者只需在打开 IDE 之前,为操作系统设置目标平台的语言环境和编码来本地化应用程序。但是,要对一个项目进行国际化,最佳的做法是将所有的用户可见字符串单独地放到绑定的属性文件中,这样可以轻松地将这些字符串转换为各种语言。
当您创建新项目时,IDE 将创建一个为项目提供缺省语言和语言环境的 Bundle.properties 文件。缺省设置是基于您计算机系统的语言和语言环境设置。然后,您可以将属性以键值对字符串的形式添加到文件中,其中值是以语言环境的语言来表示的。当您将某一语言环境添加到绑定时,将创建一个针对该语言环境的新属性文件。您添加的每种语言环境的属性文件都包含相同的键,但值是特定于语言环境的。
当客户端浏览器指定了一种语言环境后,应用程序可以使用该请求语言环境资源绑定的元素以及您在属性设置中的其他位置指定的编码,以该语言环境来构建页面。
要将语言环境添加到项目中,请在“文件”或“项目”窗口中右键单击
bundle.properties 节点,然后选择“添加语言环境”,如下图所示。
将打开“新建语言环境”窗口,您可以在其中输入语言代码、国家/地区代码和变体,方法是从下拉列表中分别选择它们,或者从预定义的语言环境列表中选择这些代码的组合,如下图所示。
要编辑属性文件,您可以在“文件”或“项目”窗口中双击其节点。将打开 Java 编辑器,您可以按 key=value 的形式输入键值对,如下图所示。
在属性编辑器中编辑属性绑定:
当您将“装入包”组件拖放到可视设计器中的页面上时,您的项目将通过添加到页面的 JSP 文件的 <f:loadBundle> 标记来访问绑定的属性文件(请参见下文)。当您部署应用程序时,系统会将属性文件复制到 WEB-INF/classes/<项目名称> 目录中,以便 <f:loadBundle> 标记能够装入该文件。
当 Web 应用程序收到客户端浏览器发出的构建页面请求时,它将检查语言环境请求。然后,应用程序会搜索与该语言环境匹配的属性文件,用该文件中的值来替换对应的键(无论它们出现在项目的何处),并以适当的编码来构建页面。
装入包组件
可以从组件面板的“高级”类别下找到“装入包”组件。当您将其拖动到可视设计器中的页面上时,它将在页面的 JavaServer Pages 代码中创建一个定制的
<f:loadBundle> 标记。该标记将一个资源绑定作为映射进行公开,并允许您使用已添加到资源绑定的语言环境。通过参阅本教程结尾的示例,您可以更好地了解装入包组件。
JavaServer Faces 文件中的国际化属性
当您查看页面的 JSP 源代码时(通过在可视设计器中单击 "JSP" 标签),您会看到一些国际化功能的作用。靠近 JSP 文件开头的三行反映了源编码、响应编码和缺省语言环境的属性值。以下各行是由源编码为 UTF-8、缺省语言环境为 ja-JP 以及响应编码为 Shift_JIS 的内容组成的。
您的系统可能会显示不同的缺省编码别名,具体情况取决于您的操作系统和语言环境。例如,您看到的可能是 MacRoman、MS950 或 SJIS。您的本机编码名称将被转换为有效的“国际因特网地址分配委员会”(Internet Assigned Numbers Authority,IANA) 编码,当 IDE 对项目的 JavaServer pages (JSP) 进行编码时将使用该编码。
请注意,在您的各个 JSP 文件中,以下属性的值应该是相同的:
对于本地化的应用程序,以下属性值应该是相同的。对于国际化的应用程序,这些值在运行时会被覆盖。
|
代码样例 2:faces-config.xml 文件中编辑后的 <application> 标记 |
<faces-config>
<application>
<locale-config>
<default-locale>jp</default-locale>
<supported-locale>en</supported-locale>
</locale-config>
</application>
</faces-config>
|
faces-config.xml 文件。 hello 来表示键、输入 hello world 来表示值,并输入 Greeting 来表示注释,如下图所示。
图 16:“新建属性”对话框 |
en 来表示语言代码,输入 US 来表示国家/地区代码,如下图所示。
图 17:“新建语言环境”对话框 |
hello 键对应的值。文件的内容应该如以下代码样例所示:| 代码样例 3:编辑后的缺省语言文件 |
#Greeting hello=\u3053\u3093\u306B\u3061\u306F\u4E16\u754C |
hello 键所对应的值会以日文字符显示。请注意:可以通过键盘输入或者从其他应用程序中进行复制并粘贴,直接在属性编辑器中将这些字符编辑为日文文本。在本示例中,您在文本编辑器中输入了用 ASCII 代码表示的日文字符。 <f:loadBundle> 标记。 <f:loadBundle> 标记。它应该如下所示:<f:loadBundle basename="hellowideworld.Bundle" var="messages1"/> var 的值将“静态文本”组件的文本绑定到资源绑定中 hello 键所对应的值。 #{messages1.hello},然后单击“确定”。请注意,静态文本组件在可视设计器中不再显示文本。运行时,如果浏览器支持显示该组件,它将显示日文文本。否则,该组件将显示英文文本。
图 18:示例应用程序输出 |
http://gceclub.sun.com.cn/prodtech/javatools/jscreator/。
|
| ||||||||||||