ITPUB??ì3
ITPUB论坛 » Java企业开发 » jsp、servlet关于中文问题再谈


标题: [精华] jsp、servlet关于中文问题再谈
离线 阿迪
老会员



精华贴数 4
个人空间 0
技术积分 1093 (1617)
社区积分 42 (5154)
注册日期 2001-11-13
论坛徽章:4
ITPUB元老管理团队2006纪念徽章会员2006贡献徽章授权会员  
      

发表于 2002-1-22 15:10 
jsp、servlet关于中文问题再谈

在jsp中,中文乱码常会让人心乱如麻。

对于中文处理的常见对策,在网上经常可见的主要是下面2种:
<%@ page contentType="text/html;charset=gb2312" %>


或者:

<%
String Hi="你好";
byte[] tmpbyte=Hi.getBytes("ISO8859_1";
Hi=new String(tmpbyte);
out.print(Hi);
%>

虚拟小龙亭也主要采用了上面2种方法进行了修改,从而变成了1.1版。

通过简单总结,示例中的中文处理发生于以下几个地方:


1 在url附带中文参数,可以直接读取。

例如:
<%= request.getParameter("showword"%>

2 与数据库有关的各种sql操作


这里使用的Access没有发生问题。

3 读取HTML form表单中递交的中文值


在jswdk中需要加以编码,较为简洁的写法如:
String name1=new String(request.getParameter("user_id".getBytes("ISO8859_1");
另外,在jdk1.3的支持下,不需要加入
<%@ page contentType="text/html;charset=gb2312" %>
而在jdk1.2.2下面,即使2种方法同时运用也很不稳定。

而在resin平台,情况较好。只要在页面第一行加入:
<%@ page contentType="text/html;charset=gb2312" %>即可正确处理中文。
如果再加编码则反而不对。

5 session中包含的中文


在jswdk中,奇怪的是如果从form中读出的值经过编码则可正确显示;
但直接赋予中文值则不行。
resin平台很好,同上。

6 对于对变量赋中文值后正确显示中文。

 

例如以下程序:
<%@ page contentType="text/html;charset=gb2312" %>
<html><head></head><body>
<%
String Hi="你好";
byte[] tmpbyte=Hi.getBytes("ISO8859_1";
Hi=new String(tmpbyte);
out.print(Hi);
%>
</body></html>
同样是jswdk1.0.1,以上的表示方法在jdk1.2.2中没有问题,但在jdk1.3下却无法显示。
resin平台很好,同上,经过测试,只需要在<head>中补上
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
而不需要<%@ page contentType="text/html;charset=gb2312" %>也能正确显示中文。


体会:


jswdk也许只能用于普通开发,稳定性和其它问题可能不如商业软件。
由于jdk1.3版性能要好于jdk1.2.2很多倍,并且对中文的支持也较好,所以应该加以采用。

作为免费的商业软件,resin不仅速度快,稳定,自动编译,可指出出错行,可在服务器端支持使用javascript等,而且,至少我觉得对中文的支持很好。


当然,如果不必做任何处理即可正确显示中文将是我们所期待的。


另外,相信在unix/linux/solaris下应该没有这样的问题。




__________________
而今迈步从头越
只看该作者    顶部
离线 qiaoyu
积极应变



精华贴数 1
个人空间 0
技术积分 404 (4723)
社区积分 417 (1517)
注册日期 2001-9-28
论坛徽章:2
ITPUB元老授权会员    
      

发表于 2002-1-22 17:02 
感谢版主,我今天也一直在测试中文的问题(JRUN+WIN2000+jdk1.2.2)

<%@ page contentType="text/html;charset=gb2312" %>
<html><head></head><body>
<%
String Hi="你好";
byte[] tmpbyte=Hi.getBytes("ISO8859_1";
Hi=new String(tmpbyte);
out.print(Hi);
%>
</body></html>
这段程序在我机器的环境下,不管在<head>里加不加meta都还是显示不出中文。
看来getBytes("ISO8859_1",还是只能在接受参数时用。


__________________
有罪众生,至彼受苦,无有间隙,故名无间。成实论言此地狱有五间:一者趣果无间,二者受苦无间,三者时无间,四者命无间,五者形无间
只看该作者    顶部
离线 leafandwinds
初级会员



精华贴数 0
个人空间 0
技术积分 2 (154756)
社区积分 0 (50233)
注册日期 2002-1-29
论坛徽章:0
      
      

发表于 2002-1-29 13:22 

但在URL中传入的参数,用iso8859-1---->byte---->unicode的方式依然无法解决问题。
http://........jsp?name=......
在用你们说的方式,无法解决name的中文问题;


__________________
我爱你,因为你掉进了我的眼里!掉进了我的心里!掉进了我的梦里!
只看该作者    顶部
离线 qiaoyu
积极应变



精华贴数 1
个人空间 0
技术积分 404 (4723)
社区积分 417 (1517)
注册日期 2001-9-28
论坛徽章:2
ITPUB元老授权会员    
      

发表于 2002-1-29 16:46 
用上这段应该没问题的
<%!
// 解决中文参数的问题
public String getStr(String str)
{
  try
  {
    String temp_p = str;
        byte[] temp_t = temp_p.getBytes("ISO8859-1";
        String temp = new String(temp_t);
        return temp;
  }
  catch(Exception e)
  {
  }
  return "null";
}
%>


__________________
有罪众生,至彼受苦,无有间隙,故名无间。成实论言此地狱有五间:一者趣果无间,二者受苦无间,三者时无间,四者命无间,五者形无间
只看该作者    顶部
离线 Dennis68cn


精华贴数 20
个人空间 0
技术积分 8560 (139)
社区积分 5538 (258)
注册日期 2002-2-19
论坛徽章:27
现任管理团队成员2008年新春纪念徽章    
      

发表于 2005-7-28 15:11 
翻出老贴,补充一点,为了国际化,本人最近采用utf-8编码,所有的jsp页面及servlet里均采用utf-8编码格式。

利用url传递中文和日文参数,方式如下,

列表页 productList.jsp

<a href="upProduct.jsp?id=<%=product.getId()%>&nm=<%=java.net.URLEncoder.encode(product.getProduct_nm(),"utf-8")%>&intr=<%=java.net.URLEncoder.encode(product.getIntroduction(),"utf-8")%>">更新</a>

接收页 upProduct.jsp,接收url传递过来的参数并显示。

  <%@page language="java" contentType="text/html; charset=utf-8" %>
  ....

   String id=request.getParameter("id");
   String xx=new String(request.getParameter("nm").getBytes("ISO-8859-1"), "utf-8");
   String xx1=java.net.URLDecoder.decode(xx,"utf-8");
   String yy=new String(request.getParameter("intr").getBytes("ISO-8859-1"), "utf-8");
   String yy1=java.net.URLDecoder.decode(yy,"utf-8");

这样转码后的 产品名称 xx1 及 产品介绍 yy1 显示正常!

注意:经过上述转码后 在windows环境和linux环境下中文,日文均能显示正常。

我写这个例子只是起演示作用,实际情况如果参数值传递过多,还是不要采用这种方式,而是采用查询数据库或是从session里取值较好,不提倡该方法。


__________________
朴素与繁华、脆弱与坚强、纯真与沧桑
只看该作者    顶部
离线 chenv
古木


精华贴数 0
个人空间 0
技术积分 1270 (1334)
社区积分 125 (2967)
注册日期 2005-5-18
论坛徽章:17
授权会员每周论坛发贴之星行业板块每日发贴之星操作系统板块每日发贴之星网络板块每日发贴之星开发板块每日发贴之星
ERP板块每日发贴之星数据库板块每日发贴之星每日论坛发贴之星   

发表于 2005-7-29 08:39 
不錯的帖子


__________________
只看该作者    顶部
离线 xyj0323
高级会员



精华贴数 2
个人空间 0
技术积分 3162 (456)
社区积分 1565 (674)
注册日期 2002-12-10
论坛徽章:4
会员2006贡献徽章2008北京奥运纪念徽章:拳击开发板块每日发贴之星开发板块每日发贴之星  
      

发表于 2005-8-12 19:59 
这里的斑竹好长时间没有见过了,不知道他们都到那个地方去了?


__________________
我从那里来,又要到那里去!
只看该作者    顶部
离线 eoeac
一般会员



精华贴数 0
个人空间 0
技术积分 226 (8357)
社区积分 0 (329638)
注册日期 2005-4-2
论坛徽章:0
      
      

发表于 2005-8-13 19:17 
谢谢分享~!


__________________
Without passion, you don't have energy; without energy, it won't work. Without a positive attitude, you will never be successful. No matter what you do, no matter how you do it, if you don't have a positive attitude in business all in life, you'll never ever be successful.
只看该作者    顶部
离线 feng.yang
中级会员


精华贴数 0
个人空间 0
技术积分 224 (8423)
社区积分 3 (20774)
注册日期 2005-8-16
论坛徽章:3
授权会员开发板块每日发贴之星开发板块每日发贴之星   
      

发表于 2005-8-17 09:19 
知了 ~~ 3xvm


__________________
使君欲醉离亭酒  酒醒离愁转有
只看该作者    顶部
离线 javer.itpub
初级会员



精华贴数 0
个人空间 0
技术积分 56 (25125)
社区积分 0 (531235)
注册日期 2005-7-26
论坛徽章:0
      
      

发表于 2005-8-23 10:17 
彻底治疗乱码顽症——J2EE.Web应用中文问题解决方案


只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问