设为首页收藏本站language 语言切换
查看: 1508|回复: 0
收起左侧

Tomcat 服务器下 JSP 页面中文问题解答

[复制链接]
发表于 2010-2-20 15:06:39 | 显示全部楼层 |阅读模式
<p >目前, Tomcat 作为一种出色的开放源代码的 JSP 服务器,目前在 JSP 的开发过程中获得了广泛的应用. 但是作为一款英语国家公司开发的软件, 在中文环境下不可避免的会出现一些乱码问题. 这里就 Tomcat 4.0 和 Tomcat 4.1 下的常见中文问题及其解决方法做一个总结. 这些方法都已经在 中文版 Windows 98 + JDK 1.3.1 和 中文版 Windows 2000 + JDK 1.3.1 下通过了测试. 另外在 IBM 的网站上有一个网页 http://www-900.ibm.com/developerWorks/cn/java/jsp_dbcsz/index.shtml 也讨论了这个问题.<p >首先为了便于讨论, 这里首先列出了一些方便的工具方法, 便于我们的讨论. 这些方法如下所示:<p ><CENTER><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>// 转换由表单读取的数据的内码到 GB2312  public String toChi(String input) {  try {  byte[] bytes = input.getBytes(&quot;ISO8859-1&quot;);  return new String(bytes);  }catch(Exception ex) {  }  return null;  }    // 对给定字符进行 URL 编码  public String encode(String value) {  if(isEmpty(value)) return &quot;&quot;;  return java.net.URLEncoder.encode(value);  }    // 对给定字符进行 URL 解码  public String decode(String value) {  if(isEmpty(value)) return &quot;&quot;;  return java.net.URLDecoder.decode(value);  }</ccid_code></pre></td></tr></table></ccid_nobr></CENTER>  <p >问题1. 浏览器中看到的 JSP 页面中的汉字怎么都成了 '?' ?<p >可能原因如下: 您的页面中没有指定页面的字符集为中文. 解决方法(适用于Tomcat 4.0 和 Tomcat 4.1)是在页面中添加如下代码:<p ><CENTER><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>&lt;%@ page contentType=&quot;text/html;charset=gb2312&quot; %&gt;  &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=gb2312&quot;&gt;</ccid_code></pre></td></tr></table></ccid_nobr></CENTER><p >问题2. 通过 POST 方法提交的表单的汉字都显示为乱码(在 Tomcat 4.0 下正常, Tomcat 4.1 下出现).<p >可能原因如下: POST 提交的字符串都是 ISO8859-1 编码的, 只要把它的字符集转换到中文就行了. 解决方法如下(适用于 Tomcat 4.1):<p ><CENTER><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>// 单个的参数  String result = toChi(request.getParameter(&quot;parameterName&quot;));  // 多个参数  String values[] = request.getParameterValues(name);  if(values != null) {  for(int i = 0; i &lt; values.length; i++) {  values = toChi(values);  }  }</ccid_code></pre></td></tr></table></ccid_nobr></CENTER><p >问题3. 通过 GET 方法提交的表单的汉字都显示为乱码(在 Tomcat 4.0 和 Tomcat 4.1 下都出现).可能原因如下: GET 提交的字符串都是 ISO8859-1 编码的, 只要把它的字符集转换到中文就行了. 解决方法如下(适用于 Tomcat 4.1, Tomcat 4.0 下不能用于 page.jsp?username=中文):<p ><CENTER><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>// 单个的参数  String result = toChi(request.getParameter(&quot;parameterName&quot;));  // 多个参数  String values[] = request.getParameterValues(name);  if(values != null) {  for(int i = 0; i &lt; values.length; i++) {  values = toChi(values);  }  }</ccid_code></pre></td></tr></table></ccid_nobr></CENTER><p >问题4. Cookie 中不能写入汉字或者汉字无法正确显示.<p >可能原因如下: Tomcat 4.0 下自动把 Cookie 做了编码为 ISO8859-1 的存储, 而 Tomcat 4.1 下的 JSP 引擎不支持包含含有汉字的 Cookie.<p >Tomcat 4.0 下的解决方法:<p ><CENTER><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>// 根据 Cookie 名称得到请求中的 Cookie 值, 如果 Cookie 值是 null, 则返回 &quot;&quot;  public String getCookieValue(HttpServletRequest request, String name) {  Cookie[] cookies = request.getCookies();  if(cookies == null) return &quot;&quot;;  for(int i = 0; i &lt; cookies.length; i++) {  Cookie cookie = cookies;  if(cookie.getName().equals(name)) {  // 需要对 Cookie 中的汉字进行 URL 反编码, 适用版本: Tomcat 4.0  return decode(cookie.getValue());  }  }  // A cookie might not return a null value, may return a &quot;&quot;  return &quot;&quot;;  }</ccid_code></pre></td></tr></table></ccid_nobr></CENTER><p >Tomcat 4.1 下的解决方法:<p ><CENTER><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>// 写入包含汉字 Cookie 的方法  response.addCookie(new Cookie(&quot;cookieName&quot;, encode(&quot;汉字&quot;)));  // 得到 Cookie 值的方法(同 Tomcat 4.0 的解决方法)  public String getCookieValue(HttpServletRequest request, String name) {  Cookie[] cookies = request.getCookies();  if(cookies == null) return &quot;&quot;;  for(int i = 0; i &lt; cookies.length; i++) {  Cookie cookie = cookies;  if(cookie.getName().equals(name)) {  // 需要对 Cookie 中的汉字进行 URL 反编码, 适用版本: Tomcat 4.0  return decode(cookie.getValue());  }  }  // A cookie might not return a null value, may return a &quot;&quot;  return &quot;&quot;;  }</ccid_code></pre></td></tr></table></ccid_nobr></CENTER><p >问题5. 在 Tomcat 4.0 下 GET 请求(如: page.jsp?username=中文) 无法返回原来的值.<p >原因: 与 Tomcat 引擎有关, 不论是否转换内码, 均无法返回原来的值, 但是有一个替代方法, 如下:<p >将 URL 地址改变为 "page.jsp?username=" + encode("中文")<p >然后使用下列代码取回参数:<p ><CENTER><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>// 单个的参数  String result = toChi(request.getParameter(&quot;parameterName&quot;));</ccid_code></pre></td></tr></table></ccid_nobr></CENTER><p >(责任编辑:董建伟)                                 <p align="center"></p></p>
您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-4-6 07:17 , Processed in 0.212375 second(s), 23 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表