Board logo

标题: JSP/Servlet 中的汉字编码问题(2) [打印本页]

作者: look_w    时间: 2018-9-14 12:14     标题: JSP/Servlet 中的汉字编码问题(2)

中文转码时'?'、乱码的由来两个方向转换都有可能得到错误的结果:
实际编程中,JSP/Servlet 程序得到错误的汉字信息,往往是这两个过程的叠加,有时甚至是两个过程叠加后反复作用的结果 .
JSP/Servlet 汉字编码问题及在 WAS 中的解决办法4.1 常见的 encoding 问题的现象网上常出现的 JSP/Servlet encoding 问题一般都表现在 browser 或应用程序端,如 :
隐藏在这些问题后面的是各种错误的字符转换和处理(除第 3 个外,是因为 Java font 设置错误引起的)。解决类似的字符 encoding 问题,需要了解 Jsp/Servlet 的运行过程,检查可能出现问题的各个点。
4.2 JSP/Servlet web 编程时的 encoding 问题运行于 Java 应用服务器的 JSP/Servlet 为 Browser 提供 HTML 内容,其过程如下图所示:
其中有字符编码转换的地方有 :
4.3 IBM Websphere Application Server 中的解决方法WebSphere Application Server 对标准的 Servlet API 2.x 作了扩展,提供较好的多语言支持。运行在中文的操作系统中,可以不作任何设置就可以很好地处理汉字。下面的说明只是对 WAS 是运行在英文的系统中,或者需要有 GBK 支持时有效。
上述 c,d 情况,WAS 都要查询 Browser 的语言设置,在缺省状况下, zh,  zh-cn 等均被映射为 JAVA encoding CP1381(注意: CP1381 只是等同于 GB2312 的一个 codepage,没有 GBK 支持)。这样做我想是因为无法确认 Browser 运行的操作系统是支持 GB2312, 还是 GBK,所以取其小。但是实际的应用系统还是要求页面中出现 GBK 汉字,最著名的是朱总理名字中的“?F"(rong2 ,0xe946,\u9555),所以有时还是需要将 Encoding/Charset 指定为 GBK。当然 WAS 中变更缺省的 encoding 没有上面说的那么麻烦,针对 a,b,参考文章 5,在 Application Server 的命令行参数中指定 -Dfile.encoding=GBK 即可; 针对 d,在 Application Server 的命令行参数中指定 -Ddefault.client.encoding=GBK。如果指定了 -Ddefault.client.encoding=GBK,那么 c 情况下可以不再指定 charset。
上面列出的问题中还有一个关于 Tag<%...%>,<%=...%> 中的 JAVA 代码里包含的静态文本未能正确显示的问题,在 WAS 中的解决方法是除了设置正确的 file.encoding, 还需要以相同方法设置 -Duser.language=zh -Duser.region=CN。这与 JAVA  locale 的设置有关。
4.4 数据库读写时的 encoding 问题JSP/Servlet 编程中经常出现 encoding 问题的另一个地方是读写数据库中的数据。
流行的关系数据库系统都支持数据库 encoding,也就是说在创建数据库时可以指定它自己的字符集设置,数据库的数据以指定的编码形式存储。当应用程序访问数据时,在入口和出口处都会有 encoding 转换。对于中文数据,数据库字符编码的设置应当保证数据的完整性 .  GB2312,GBK,UTF-8 等都是可选的数据库 encoding;也可以选择 ISO8859-1 (8-bit),那么应用程序在写数据之前须将 16Bit 的一个汉字或 Unicode 拆分成两个 8-bit 的字符,读数据之后则需将两个字节合并起来,同时还要判别其中的 SBCS 字符。没有充分利用数据库 encoding 的作用,反而增加了编程的复杂度,ISO8859-1 不是推荐的数据库 encoding。JSP/Servlet 编程时,可以先用数据库管理系统提供的管理功能检查其中的中文数据是否正确。
然后应当注意的是读出来的数据的 encoding,JAVA 程序中一般得到的是 Unicode。写数据时则相反。
4.5 定位问题时常用的技巧定位中文 encoding 问题通常采用最笨的也是最有效的办法――在你认为有嫌疑的程序处理后打印字符串的内码。通过打印字符串的内码,你可以发现什么时候中文字符被转换成 Unicode,什么时候 Unicode 被转回中文内码,什么时候一个中文字成了两个 Unicode 字符,什么时候中文字符串被转成了一串问号,什么时候中文字符串的高位被截掉了……
取用合适的样本字符串也有助于区分问题的类型。如:”aa 啊 aa?@aa”等中英相间、GB、GBK 特征字符均有的字符串。一般来说,英文字符无论怎么转换或处理,都不会失真(如果遇到了,可以尝试着增加连续的英文字母长度)。
结束语其实 JSP/Servlet 的中文 encoding 并没有想像的那么复杂,虽然定位和解决问题没有定规,各种运行环境也各不尽然,但后面的原理是一样的。了解字符集的知识是解决字符问题的基础。不过,随着中文字符集的变化,不仅仅是 java 编程,中文信息处理中的问题还是会存在一段时间的。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0