Java的国际化问题(中日文编码问题)
1、常见的Encoding现象
网上常出现的 JSP/Servlet encoding 问题一般都表现在 browser 或应用程序.
隐藏在这些问题后面的是各种错误的字符转换和处理。解决类似的字符 Encoding问题,需要了解 Jsp/Servlet 的运行过程,检查可能出现问题的各个点。
2、JSP/Servlet web 编程时的 Encoding具体分析
1、JSP 编译。
2、Java 需要被编译为 .class 才能在 JVM 中执行。
3、Servlet 需要将HTML页面内容转换为 browser 可接受的 encoding 内容发送出去。
依赖于各 JAVA App Server 的实现方式,有的将查询 Browser 的 accept-charset 和 accept-language 参数或以其它猜的方式确定 encoding 值,有的则不管。因此采用固定encoding 也许是最好的解决方法。对于中文网页,可在 JSP 或 Servlet 中设置 contentType="text/html; charset=GB2312";如果页面中有GBK字符,则设置为contentType="text/html; charset=GBK",由于IE 和 Netscape对GBK的支持程度不一样,作这种设置时需要测试一下。
因为16位 JAVA char在网络传送时高8位会被丢弃,也为了确保Servlet页面中的汉字(包括内嵌的和servlet运行过程中得到的)是期望的内码,可以用 PrintWriter out = res.getWriter() 取代 ServletOutputStream out = res.getOutputStream()。PrinterWriter 将根据contentType中指定的charset作转换 (ContentType需在此之前指定!);也可以用OutputStreamWriter封装 ServletOutputStream 类并用write(String)输出汉字字符串。对于 JSP,JAVA Application Server 应当能够确保在这个阶段将嵌入的汉字正确传送出去。这是解释 URL 字符 encoding 问题。
4、如果通过 get/post 方式,servlet 将无法得到正确的值。
SUN的 J2SDK 中,HttpUtils.parseName 在解析参数时根本没有考虑 browser 的语言设置,而是将得到的值按 byte 方式解析。这是网上讨论得最多的 encoding 问题。因为这是设计缺陷,只能以 byte 方式重新解析得到的字符串;或者以修改HttpUtils 类的方式解决。不过最好将其中的中文 Encoding GB2312、 CP1381 都改为 GBK,否则遇到 GBK 汉字时,还是会有问题。
----------------------------------------------------
J2ME开发中的国际化问题 |
昨天,闲来无事阅读了一下JSR 238的规范。规范是由Nokia领导完成的。规范中最重要的一点就是定义了一种二进制格式的资源文件,资源文件中可以存储文本,二进制数据例如png图片。二进制文件的优势在规范中列举了4点,大家有兴趣可以下载来看看。资源文件由四个部分构成:文件特征,头文件长度,头文件和资源数据。头文件长度标记了头文件的大小。而头文件中包含了所有资源数据的id,类型和偏移量(相对文件)。每个实体由8个字节组成,高位4个字节代表id,低4位第个字节的第一个代表类型,主要有三种类型文本,二进制和文件尾。后面三个字节是偏移量。资源数据中就是所有的数据了,比如文本和图片。 JSR 238中还定义了4个Class,最重要的就是ResourceManager。他可以管理资源文件,并且根据ID读取出需要的内容来。目前支持jsr 238的手机还比较少一些,但是有了这个规范我们大可以自己来实现ResourceManager,并配合适当的缓存机制把经常使用的内容缓存在内存中。其他的随时读取。ResourceManager一定要把Header表缓存起来,这样就不用每次查找的时候都要解析header了。 有了这个想法之后就动手写了一个ResourceManager,把wtk 2.5里面 I18NDemo里面的res文件读取了一下,果然里面定义了一些中文文本。接着又读取了一个德文的,就看不明白了。 希望这个思路对大家有帮助。 |
MIDlet 国际化使用 JSR-238 Mobile Internationalization API 更快地全球化您的应用程序 |
级别: 初级 Meng Wong, 软件工程师, IBM 2007 年 1 月 25 日 国际化不仅仅是一个趋势 —— 它已经成为应用程序开发的必要需求。JSR-238 的目的是帮助 Java™ Platform,Micro Edition(Java ME)开发人员利用 Mobile Information Device Profile(MIDP)/Connected Limited Device Configuration(CLDC)将其国际化工作减至最少。通过这篇文章发现一种国际化 MIDlet 的更便捷方法。 您是否曾尝试过国际化 MIDlet,却以失败告终?使用 MIDP/CLDC 本地化 MIDlet 需要完成大量的工作,Java Platform,Standard Edition(Java SE)以成熟的 API 简化国际化工作。CDC Foundation 提供了大量 API 来完成国际化和本地化工作。而如果使用 MIDP/CLDC 来完成这些工作,将是一次非常痛苦的经历;甚至没有一个可用的 作为开始,看一下 Java SE 和 Java ME 对全球化支持的对比,如 图 1 所示。(本图是从 “Considerations of Globalization Solutions in J2ME” 文中转载的。参见 参考资料 中的链接。) 图 1. Java SE 和 Java ME 全球化支持的对比 图 1 显示出,编写一个支持全球化的 Java SE 应用程序是十分简单的;Java SE 提供了开发全球化应用程序所需的几乎所有东西。CDC Foundation 提供了一些用来编写全球化应用程序的 API ,但不是全部。然而建立在 MIDP/CLDC 基础上的应用程序仅提供有限的日历和时区的相关类,您需要亲自编写几乎所有的全球化类。 要本地化 MIDlet,通常需要使用 MIDP 核心类编写 为了实现国际化功能,就是说根据不同的地区显示其当地语言,您需要编写自己的
JSR-238 Mobile Internationalization API 简介 国际化 MIDlet 是接触更广阔市场的一个关键条件。新的 JSR-238 Mobile Internationalization API 提供了一种标准方法帮助您更快、更轻松地实现 MIDlet 国际化,还提供了用 MIDP/CLDC 实现 MIDlet 国际化的基础 API。 请注意:JSR-238 API 是一个可选的软件包。开始向其部署 JSR-238 MIDlet 之前,必须确保您的设备支持它。
JSR-238 包,javax.microedition.global 提供的一些重要类如下:
我将具体讨论这些类,但在此之前您必须了解,您将需要使用 Sun Java Wireless Toolkit 2.5 for CLDC Beta、Nokia JSR-238 RI 或 Eclipse 来配合 JSR-238 开发 MIDlet。本例将使用 Eclipse。 首先,您需要获得 JSR-238 库,它是随 Sun WTK 2.5 Beta、Nokia 的 JSR-238 RI 一起提供的。IBM® 在 WebSphere® Everyplace Micro Environment 移植包中提供了 JSR-238,IBM 业务合作伙伴都可以使用。 如果您现在使用的是 WTK 的老版本,其中不包括 JSR-238 库,您需要自己添加 JSR-238。您依然可以在 Eclipse 编写和编译,但由于类加载器的限制,Eclipse 是无法启动的。要配置 Java ME 项目以包含 JSR-238 支持:
就是这样!您已经将 JSR-238 库添加到开发环境中可,现在就可以开始编写 MIDlet 国际化程序了。
现在我将演示如何使用 要用不同的语言来显示本地字符串,就需要准备不同地区的资源文件。资源文件包括要本地化的字符串,如果有图片的话,也要将其包含在资源文件里面。资源文件就像 Java SE 的属性文件,但是是二进制格式。它有以下优点:
对于条件有限的设备来说,这些优点是十分重要和有效的。 现在让我们编写一个简单的 MIDlet,根据地区显示字符串和图片。图 5 显示了资源文件结构。在以下步骤中,我将使用 WebSphere Everyplace Micro Environment 6.1 和 IBM WebSphere Everyplace Micro Environment 移植包的 JSR-238 库。
图 5. 资源文件结构 二进制的资源文件必须遵守严格的格式。(参考 JSR-238 规范)。可以使用任何一种二进制文件编辑器或者 Nokia JSR-238 RI 创建资源文件。 为演示起见,我使用 Nokia JSR-238 RI 来创建二进制资源文件,如 图 6 所示。我想为 zh-TW,de-DE 和 es-ES 这几个地区显示 “Welcome” 字符串和一幅图片。可以阅读 Nokia 238 RI 的自述文件了解相关步骤,但基本上,您需要为字符串和图片编写一个 xml 资源文件,运行 ResourceMaker 工具获得二进制文件。 图 6. Nokia JSR-238 RI 示例资源文件 在 图 7 中,采用当地语言的字符串存储在一个地区文件夹中,图片的二进制文件存储在 \global\WelcomeMidlets.res 中。您不会希望图像的二进制文件存储在每一个资源文件中! 图 7. 将资源文件放到正确的结构中 为了从资源文件检索字符串和图片,您需要执行下列步骤:
表 1. ResourceManager 方法
以下代码返回具有 “WelcomeMidlet” 基本名称以及系统默认地区的
使用以下代码检索字符串:
使用下列代码检索图片:
清单 1 演示了这些步骤。 清单 1. 字符串和图片检索
表 2 展示了在 zh-TW 和 de-DE 地区显示 “Welcome MIDlet” 的结果。 表 2. Welcome MIDlet
就是这样!使用资源文件管理不同地区的本地化字符串,将图片的二进制文件转换为所有地区都可以使用的通用资源。
每一个地区都有自己的文化,都采用自己的方式显示日期、时间、数字、百分数和货币数据。 表 3. 数据格式化方法
现在将编写一个简单的 MIDlet 程序来显示日期、时间、数字、百分比和货币数据。
您可以指定地区,也可使用系统默认地区。下面是所需要的代码:
您希望创建可编辑的文本文件以使用户输入数字、百分数、货币数据等等。您需要这些文本字段的内容和对其进行格式化的 清单 2. 数据格式化
现在运行 MIDlet。表 4 显示了应获得的结果。(注意:我为 zh-TW 使用了一种不同的字体。) 表 4. Formatter MIDlet
清单 3 给出了一个简单的 MIDlet,它示范了日期格式化。 清单 3. 日期格式化 MIDlet
表 4 展示了 DateTime format MIDlet 在 zh-TW 和 de-DE 这两个地区的显示结果。 表 4. DateTime format MIDlet
可以使用
JSR-238 提供了一种更快、更简单的方法,利用 MIDP/CLDC 来国际化您的 MIDlet。使用 javax.microedition.global 包中的 |