查看: 44837|回复: 54

[精华] jsp、servlet关于中文问题再谈

[复制链接]
论坛徽章:
4
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33管理团队2006纪念徽章
日期:2006-04-16 22:44:45会员2006贡献徽章
日期:2006-04-17 13:46:34
发表于 2002-1-22 15:10 | 显示全部楼层 |阅读模式
在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下应该没有这样的问题。

论坛徽章:
2
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33
发表于 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",还是只能在接受参数时用。

使用道具 举报

回复
论坛徽章:
0
发表于 2002-1-29 13:22 | 显示全部楼层

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

使用道具 举报

回复
论坛徽章:
2
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33
发表于 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";
}
%>

使用道具 举报

回复
论坛徽章:
60
ITPUB8周年纪念徽章
日期:2009-09-27 10:21:222012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14
发表于 2005-7-28 15:11 | 显示全部楼层
翻出老贴,补充一点,为了国际化,本人最近采用utf-8编码,所有的jsp页面及servlet里均采用utf-8编码格式。

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

  1. 列表页 productList.jsp

  2. <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传递过来的参数并显示。

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

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

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

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

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

使用道具 举报

回复
论坛徽章:
17
每日论坛发贴之星
日期:2005-07-22 01:01:12数据库板块每日发贴之星
日期:2005-07-23 01:01:25ERP板块每日发贴之星
日期:2005-07-23 01:01:39每周论坛发贴之星
日期:2005-07-24 01:35:14开发板块每日发贴之星
日期:2005-08-03 01:02:20网络板块每日发贴之星
日期:2005-08-04 01:02:12操作系统板块每日发贴之星
日期:2005-08-05 01:01:51行业板块每日发贴之星
日期:2005-08-06 01:02:48授权会员
日期:2005-10-30 17:05:33
发表于 2005-7-29 08:39 | 显示全部楼层
不錯的帖子

使用道具 举报

回复
论坛徽章:
5
开发板块每日发贴之星
日期:2005-09-20 01:02:25开发板块每日发贴之星
日期:2005-09-25 01:02:23会员2006贡献徽章
日期:2006-04-17 13:46:34奥运会纪念徽章:拳击
日期:2008-08-15 14:59:34马上有车
日期:2014-03-06 20:08:58
发表于 2005-8-12 19:59 | 显示全部楼层
这里的斑竹好长时间没有见过了,不知道他们都到那个地方去了?

使用道具 举报

回复
论坛徽章:
0
发表于 2005-8-13 19:17 | 显示全部楼层
谢谢分享~!

使用道具 举报

回复
论坛徽章:
3
开发板块每日发贴之星
日期:2005-09-04 01:02:30授权会员
日期:2006-06-15 11:28:19开发板块每日发贴之星
日期:2006-06-16 01:02:38
发表于 2005-8-17 09:19 | 显示全部楼层
知了 ~~ 3xvm

使用道具 举报

回复
论坛徽章:
0
发表于 2005-8-23 10:17 | 显示全部楼层

彻底治疗乱码顽症——J2EE.Web应用中文问题解决方案

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

PostgreSQL中国大会,参会票抢购!

由 PostgreSQL中文社区与ITPUB联合主办的第九届《PostgreSQL 中国技术大会》将在北京隆重召开。PostgreSQL 作为功能最强的的开源关系型数据库之一,得到了越来越多企业的推广和运用,也越来越受到广大技术爱好者的欢迎和重视。这将是 PostgreSQL 的又一次交流盛会。
----------------------------------------
时间:2019年11月29~11月30日

点击报名>>
TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表