solaris上开发J2EE应用中文问题的解决

原创 2001年11月13日 14:29:00

 

 关于JSP和J2EE的中文问题和处理方法,网上已经有很多文章。一般在中文内核的操作系统(如中文NT,windows2000)上,该问题不是很突出,而在其他一些系统(如linux,solaris)中就比较明显了。近日在solaris上开发一个J2EE的应用系统,环境是solaris 2.7+minij2ee+mysql。系统在windows和linux下均没有出现中文处理的问题,但部署到solaris上面后所有中文显示为?。
 后来经过分析,发现原因出在系统编码上。由于安装solaris时默认的系统编码为ASCII,因此以默认的系统编码处理字符串时汉字高位信息丢失。下面一段简单的jsp程序说明了这个问题:
<%@ page contentType="text/html;charset=gb2312"%>
<%
String str=request.getParameter("i");
//byte[] b=str.getBytes("iso-8859-1");
byte[] b=str.getBytes();
out.println(new String(b,"gb2312"));
%>
在浏览器中输入foo.jsp?i=中文,结果显示为??。如果将byte[] b=str.getBytes();换成上面注释掉的byte[] b=str.getBytes("iso-8859-1");,则正常显示出“中文”二字。查阅了mysql JDBC的驱动程序,问题相同。
考虑解决的方法有两个,一个是修改JDBC驱动程序,另一个是将汉字编码成7位,从实现方便的角度选择了后者。不过后者的缺点是字符串长度增加,并且无法直接通过sql工具来修改数据库了。网上有一种汉字编码的方法,是将汉字高位去1,英文则补一个0表示。这种方法有缺陷,因为特定的汉字编码后会出现“'”等SQL语句中有歧义的字符,导致sql失败。我摘取了minij2ee中uniString的编码方法,该方法将字节表示为其16进制编码,下面是源代码:
public String encode()
{
 try
 {
  StringBuffer sb=new StringBuffer();
  byte[] bytes=m_enc.compareTo("")==0?m_str.getBytes():m_str.getBytes(m_enc);

  for(int i =0;i<bytes.length;i++)
  {
   char ch;
   ch=Character.forDigit((bytes[i]>>4)&0xF,16);
   sb.append(ch);
   ch=Character.forDigit(bytes[i]&0xF,16);
   sb.append(ch);
  }
  
  return sb.toString();
 }
 catch(java.io.UnsupportedEncodingException e)
 {
  throw new RuntimeException("Unsupported encoding type.");
 }
}

public void decode(String encodestr)
{
 StringBuffer sb=new StringBuffer();
 int i=0;
 
 while(i!=encodestr.length())
 {
  sb.append((char)Integer.parseInt(encodestr.substring(i,i+2),16));
  i+=2;
 }
 
 m_str=new uniString(sb.toString(),"iso-8859-1").cvt(m_enc);
}
使用编码后,问题解决。
 另外提一下,minij2ee最新版本中提供一个uniString类,解决了在所有操作系统上的中文问题。使用uniString对象,无需关心字符串本身编码,使用时只要调用函数来获得需要的编码即可,如在jsp里调用uniString.gb()即可以以gb2312输出字符串,在数据库存储时调用uniString.sys()即可以以系统默认编码输出字符串,无论在中文内核还是英文内核的操作系统上均通用。

黄凯


更多的技术文档,尽在minij2ee技术文档中心,请访问 http://www.minij2ee.com/document/


 

Solaris上开发J2EE应用时中文问题的解决

关于JSP和J2EE的中文问题和处理方法,网上已经有很多文章。一般在中文内核的操作系统(如中文NT,windows2000)上,该问题不是很突出,而在其他一些系统(如linux,Solaris)中就比...
  • sun_solaris
  • sun_solaris
  • 2007年03月02日 15:18
  • 579

基于j2ee的web应用

本文已经在《微型机与应用》发表,并被万方等多个数据库录用。  基于j2ee技术的Web应用倪礼豪(*****************************,浙江**)摘要  J2EE和DotNet框...
  • nilihao
  • nilihao
  • 2007年08月29日 16:10
  • 2590

简明教程:如何在Solaris操作系统上开发C 应用程序

1,开发C程序的必要工具和设置A,Solaris下的开发工具在solaris下开发C应用程序,缺省开发环境是Sun Studio。目前Sun Studio 11是Sun公司最新的C/C++/Fortr...
  • sunboy_2050
  • sunboy_2050
  • 2011年04月14日 17:48
  • 5296

J2EE -- 数据库事务处理的实现

JavaBeanJavaBean是用Java语言编写的与平台无关的组件。它是描述Java的软件组件模型,有点类似于Microsoft的COM组件的概念。在 Java模型中,通过JavaBean可以无限...
  • always_my_fault
  • always_my_fault
  • 2007年11月26日 14:15
  • 857

解决Solaris应用程序开发内存泄漏问题 (1)

作者: 李凌云,张一峰(laoeyu)概述内存泄漏是应用软件开发过程中经常会遇到的问题,应用长期内存泄漏会占用大量操作系统内存资源,直接导致应用程序运行不稳定,严重时甚至还会影响到操作系统的正常运行。...
  • laoeyu
  • laoeyu
  • 2006年06月07日 13:33
  • 9939

【J2EE】企业级项目开发总结--JMS基础篇

前面回顾到EJB,说了SessionBean和EntityBean还没提到MessageDrivenBean,我们先了解JMS以后再来谈MessageDrivenBean.下面来看学习和使用JMS必须...
  • zhuanzhe117
  • zhuanzhe117
  • 2015年09月23日 11:16
  • 1998

如何在j2ee项目中处理高并发量访问?

经过查资料,方案如下所示。   1 从最基础的地方做起,优化我们写的代码,减少必要的资源浪费。         a、避免频繁的使用new对象,对于整个应用只需要存在一个实例的类,我们...
  • MrCheng6201745
  • MrCheng6201745
  • 2015年10月14日 14:00
  • 1507

Solaris10上安装Redis3.0.6

背景:因项目需求需要提供redis服务,而现有生产环境操作系统都为Solaris10,所以要在Solaris上编译Redis,以下为在安装过程中所遇到的问题进行了记录,方便大家进行参考。...
  • zhangjinqi51
  • zhangjinqi51
  • 2016年09月02日 15:00
  • 605

初学者怎样才能开发出高效的J2EE系统

首先,我们需要搞清楚的是,Java和J2EE是两种不同的概念:Java不仅仅是指一种语言,它已经代表与微软不同的另外一个巨大阵营,所以Java有时是指一种软件系统的流派,当然目前最主要的两大流派(体系...
  • u014484715
  • u014484715
  • 2014年10月14日 10:26
  • 882

如何在j2ee项目中处理高并发量访问(一)

本内容是我从各处转载整理得来,是我的学习笔记,如有涉及到版权问题,请给我留言。 或者内容中有不正确的地方,也请各位大神能帮我指出更改,谢谢! 一般需从三点入手。 一、程序本身...
  • dorapan1987
  • dorapan1987
  • 2015年03月19日 13:24
  • 864
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:solaris上开发J2EE应用中文问题的解决
举报原因:
原因补充:

(最多只允许输入30个字)