JSP/Servlet 中的汉字编码问题

<span class="apple-style-span" style="font: medium simsun; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate;"><span class="apple-style-span" style="font-size: 12px; line-height: 19px; font-family: verdana, nsimsun, sans-serif;">2001 年 3 月 01 日
 
<blockquote>[i]网上就 jsp/servlet 中 dbcs字符编码问题有许多优秀的文章和讨论,本文对它们作一些整理,并结合ibm websphere application server3.5(was)的解决方法作一些说明,希望它不是多余的。[/i]</blockquote><p style="margin-top: 0px; margin-bottom: 0px; padding-bottom: 8px; padding-top: 5px;"><a name="n10037"><span class="atitle" style="font-weight: bold; font-size: 18px; font-family: arial, sans-serif;">问题的起源</span></a>
<table border="0" cellspacing="0" cellpadding="0" width="100%"><tbody><tr><td style="line-height: 19px;"><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1"><br><img src="http://www.ibm.com/i/c.gif" border="0" alt="" width="8" height="6"></td></tr></tbody></table><table class="no-print" border="0" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td style="line-height: 19px;"><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4"><br><table border="0" cellspacing="0" cellpadding="0"><tbody><tr><td style="line-height: 19px;" valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" border="0" alt="" width="16" height="16"><br></td><td style="line-height: 19px;" align="right" valign="top"><a class="fbox" style="font-size: 12px; color: #5c81a7; line-height: 13px; font-family: verdana, nsimsun, arial, sans-serif; text-decoration: none;" href="/admin/#main">[b]回页首[/b]</a></td></tr></tbody></table></td></tr></tbody></table><br>
<p style="margin-top: 0px; margin-bottom: 0px; padding-bottom: 8px; padding-top: 5px;"><a name="n1004c"><span class="atitle" style="font-weight: bold; font-size: 18px; font-family: arial, sans-serif;">gb2312-80,gbk,gb18030-2000 汉字字符集及 encoding</span></a>[*]它并没有确定所有的字形,只是规定了编码范围,留待以后扩充。
[*]编码是变长的,其二字节部分与 gbk 兼容;四字节部分是扩充的字形、字位,其编码范围是首字节 0x81-0xfe、二字节0x30-0x39、三字节 0x81-0xfe、四字节0x30-0x39。
[*]它的推广是分阶段的,首先要求实现的是能够完全映射到 unicode 3.0 标准的所有字形。
[*]它是国家标准,是强制性的。
</ul><p style="margin-top: 0px; margin-bottom: 0px; padding-bottom: 8px; padding-top: 5px;">现在还没有任何一个操作系统或软件实现了 gbk2k 的支持,这是现阶段和将来汉化的工作内容。 
<table border="0" cellspacing="0" cellpadding="0" width="100%"><tbody><tr><td style="line-height: 19px;"><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1"><br><img src="http://www.ibm.com/i/c.gif" border="0" alt="" width="8" height="6"></td></tr></tbody></table><table class="no-print" border="0" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td style="line-height: 19px;"><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4"><br><table border="0" cellspacing="0" cellpadding="0"><tbody><tr><td style="line-height: 19px;" valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" border="0" alt="" width="16" height="16"><br></td><td style="line-height: 19px;" align="right" valign="top"><a class="fbox" style="font-size: 12px; color: #5c81a7; line-height: 13px; font-family: verdana, nsimsun, arial, sans-serif; text-decoration: none;" href="/admin/#main">[b]回页首[/b]</a></td></tr></tbody></table></td></tr></tbody></table><br>
<p style="margin-top: 0px; margin-bottom: 0px; padding-bottom: 8px; padding-top: 5px;"><a name="3"><span class="atitle" style="font-weight: bold; font-size: 18px; font-family: arial, sans-serif;">中文转码时'?'、乱码的由来</span></a>
[*]byte-->unicode, 如果byte标识的字符在源代码集不存在,则得到的结果是0xfffd.<p style="margin-top: 0px; margin-bottom: 0px; padding-bottom: 8px; padding-top: 5px;">如:<span class="apple-converted-space"> </span><br>byte ba[] = {(byte)0x81,(byte)0x40,(byte)0xb0,(byte)0xa1}; new string(ba,"gb2312");
</ul><p style="margin-top: 0px; margin-bottom: 0px; padding-bottom: 8px; padding-top: 5px;">实际编程中,jsp/servlet 程序得到错误的汉字信息,往往是这两个过程的叠加,有时甚至是两个过程叠加后反复作用的结果. 
<table border="0" cellspacing="0" cellpadding="0" width="100%"><tbody><tr><td style="line-height: 19px;"><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1"><br><img src="http://www.ibm.com/i/c.gif" border="0" alt="" width="8" height="6"></td></tr></tbody></table><table class="no-print" border="0" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td style="line-height: 19px;"><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4"><br><table border="0" cellspacing="0" cellpadding="0"><tbody><tr><td style="line-height: 19px;" valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" border="0" alt="" width="16" height="16"><br></td><td style="line-height: 19px;" align="right" valign="top"><a class="fbox" style="font-size: 12px; color: #5c81a7; line-height: 13px; font-family: verdana, nsimsun, arial, sans-serif; text-decoration: none;" href="/admin/#main">[b]回页首[/b]</a></td></tr></tbody></table></td></tr></tbody></table><br>
[*]浏览器中看到的 jsp/servlet 页面中的汉字怎么都成了 ’?’ ?
[*]浏览器中看到的 servlet 页面中的汉字怎么都成了乱码?
[*]java 应用程序界面中的汉字怎么都成了方块?
[*]jsp/servlet 页面无法显示 gbk 汉字。
[*]jsp 页面中内嵌在<%...%>,<%=...%>等tag包含的 java code 中的中文成了乱码,但页面的其它汉字是对的。
[*]jsp/servlet 不能接收 form 提交的汉字。
[*]jsp/servlet 数据库读写无法获得正确的内容。
</ul><p style="margin-top: 0px; margin-bottom: 0px; padding-bottom: 8px; padding-top: 5px;">隐藏在这些问题后面的是各种错误的字符转换和处理(除第3个外,是因为 java font 设置错误引起的)。解决类似的字符 encoding 问题,需要了解 jsp/servlet 的运行过程,检查可能出现问题的各个点。 
</font></span>
<span class="apple-style-span" style="font: medium simsun; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate;"><span class="apple-style-span" style="font-size: 12px; line-height: 19px; font-family: verdana, nsimsun, sans-serif;"><p> 
 
<p style="margin-top: 0px; margin-bottom: 0px; padding-bottom: 8px; padding-top: 5px;">运行于java 应用服务器的 jsp/servlet 为 browser 提供 html 内容,其过程如下图所示:<br><span class="apple-converted-space"> <img src="http://www.ibm.com/developerworks/cn/java/jsp_dbcsz/image001.gif" alt="" width="807" height="181"></span><br>
[*]<p style="margin-top: 0px; margin-bottom: 0px; padding-bottom: 8px; padding-top: 5px;">java 需要被编译为 .class 才能在 jvm 中执行,这个过程存在与a.同样的 file.encoding 问题。从这里开始 servlet 和 jsp 的运行就类似了,只不过 servlet 的编译不是自动进行的。对于jsp程序, 对产生的java 中间文件的编译是自动进行的(在程序中直接调用sun.tools.javac.main类). 因此如果在这一步出现问题的话, 也要检查encoding和os的语言环境,或者将内嵌在jsp java code 中的静态汉字转为 unicode, 要么静态文本输出不要放在 java code 中。 对于servlet, javac 编译时手工指定-encoding 参数就可以了。
[*]
[*]<p style="margin-top: 0px; margin-bottom: 0px; padding-bottom: 8px; padding-top: 5px;">这是解释 url 字符 encoding 问题。如果通过 get/post 方式从 browser 返回的参数值中包含汉字信息, servlet 将无法得到正确的值。sun的 j2sdk 中,httputils.parsename 在解析参数时根本没有考虑 browser 的语言设置,而是将得到的值按 byte 方式解析。这是网上讨论得最多的 encoding 问题。因为这是设计缺陷,只能以 bin 方式重新解析得到的字符串;或者以 hack httputils 类的方式解决。参考文章 2 均有介绍,不过最好将其中的中文 encoding gb2312、 cp1381 都改为 gbk,否则遇到 gbk 汉字时,还是会有问题。 servlet api 2.3 提供一个新的函数 httpserveletrequest.setcharacterencoding 用于在调用 request.getparameter(“param_name”) 前指定应用程序希望的 encoding,这将有助于彻底解决这个问题。
</ul> 
<font class="apple-style-span" style="font-weight: normal; text-indent: 0px; line-height: normal; font-style: normal; white-space: normal; letter-spacing: normal; border-collapse: separate; font-variant: normal;" size="4" color="#000000"><font class="apple-style-span" style="font-size: 12px; line-height: 19px;"> 
</font></font></span><font class="apple-style-span" style="font-weight: normal; text-indent: 0px; line-height: normal; font-style: normal; white-space: normal; letter-spacing: normal; border-collapse: separate; font-variant: normal;" size="4" color="#000000"> 
</font></span> 
 
</span></p> 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值