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 汉字时,还是会有问题。