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

minij2ee2000 2001-09-28 07:32:53
关于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.iso()即可以以iso-8859-1编码输出字符串,无论在中文内核还是英文内核的操作系统上均通用。


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


...全文
68 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lci21 2001-09-29
  • 打赏
  • 举报
回复
sigh
c7654321 2001-09-28
  • 打赏
  • 举报
回复
zhq2000 2001-09-28
  • 打赏
  • 举报
回复
good!
【下载说明】
此为此Unix系统书籍中译本的清晰PDG格式下载。

【内容提要】
本书是针对Solaris的最新版本—Solaris 9的一本参考大全。全面系统地介绍了Solaris系统的基本概念以及命令的使用,目的是帮助读者迅速掌握Solaris系统的管理和使用。 本书既覆盖了通用的UNIX主题—设备、进程、shell、编程,同时又囊括了Solaris的专有主题—NIS+、卷管理、基于角色的访问控制等。全书分七个部分,分别介绍了Solaris系统的安装、系统基础、管理用户和组、管理文件系统和打印机、连网、服务和目录以及企业应用。 本书每一部分都在介绍基本概念的基础上详细讲解了Solaris常用命令的使用方法。内容由浅入深,重视理论联系实际。既可作为Solaris新手的入门指南,又可作为Solaris系统管理员的一本不可多得的参考书。

【前言摘要】
Solaris是当今世界上使用最广泛的UNIX操作系统。虽然我无法引用一些数据(我读过的IDC报告可以支持我的说法),但是当其他公司悄悄消失的时候,Sun已处在分布式和企业系统技术的前沿。Sun已经开发J2EE、Jiro、Jini以及其他一些技术,这些技术去除了一些传统的障碍,得到了高度可用、松耦合但集成的系统。 Solaris 9是一个可以追溯20年历史的系统的最新版。从SPARC和UltraSPARC芯片的发展到64位UNIX的广泛应用(甚至在桌面系统上都有Sun的产品),创新和稳定是驱动Solaris不断成功的因素。虽然Solaris 9引入了许多新特性,但这些都是建立在现有的优点之上的,而不是完全改变方向。
基于J2EE架构下网络教学平台的设计与实现 摘 要:分析了在构件网络教学平台过程中用到的几个关键J2EE技术。以中国·联合国计划发展暑 403项目中网络教学平台的开发为例,结合甘肃省经济现状,探讨了在J 2EE环境下如何建立一个网 络教学平台的基本框架。 关键词:J2EE;网络教学;教学平台 中图分类号:G434 1 引言 近年来中国西部省份教师的补充及教师质量的 提高取得了长足发展,但合格教师仍然不足,尤其在 农村地区。中国·联合国发展计划署应用远程教育 和ICT技术旨在提高中国西部贫穷地区教师质量。 作者参与了此项目并针对甘肃省教育、经济现状开 发了一个基于J2EE架构的网络教学平台。其基本 组织结构是基于省、县、乡三级资源中心的组织模 型。该教学平台可以采用基于卫星传送或网络传送 等多种远程教学方法。图1是系统运行网络结构 图。 系统开发基于J2EE架构技术,实现平台无关 性、具备开放性与继承性。J2EE是一个涉及多个层 面的复杂概念,系统采用Browser/Web Server、Appli2 cation Server和DB Server多层结构,方便系统的维护 和扩充系统完全,提供比Windows更安全的、更能扩 展的应用服务器,允许用户可以选择更多的可靠的, 可扩展的操作系统平台(如:AIX,Solaris,Linux等), 提供更好的扩展接口Web Service(SOAP/XML)到其 它相关系统等。 同时通过标准和可重用的J2EE技术(如:JSP, Servlet,EJB组件等),可以快速和安全的部署实施 网络教学远程培训的基础设施。 2 实现网络教学平台的几种J2EE技术 J 2EE平台由一整套服务(Services)、应用程序接......

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧