动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.新建eclipse(roller2.1.1)工程.
.J2ME-MIDP1.0小游戏入门-五子棋1.
.Java学习之This的用处.
.Java调试教程--Jikes概述.
.对象引用是怎样严重影响垃圾收集.
.实现方案的隐藏.
.学习javabean.
.在客户端JAVASCRITP处理TEXTFORM.
.struts构建文件上传(三).
.Java图像处理.
.彻底学习Java语言中的覆盖和重载.
.Java Servlet 编程及应用之七.
.用Java解决国际化问题.
.Eclipse3.0配置SQLExplorer数据库.
.学习WSAD、ROSE、WEBSPHERE的基本.
.protected:“友好的一种”.
.实现Java平台的三种方式v.
.使用J2EE Web应用的事件功能.
.Java Applet编程之声音和图像的协.
.在S1AS7中配置MySQL(支持CMP).

Java字符丢失与中文编码

发表日期:2008-1-5 |



  1. 引言
在用Java进行开发时,偶然在IO操作中会产生字符丢失现象。如在用BEA的WORKSHOP开发CMP EJB过程中,总是编译不通过,报错:

cannot resolve symbol

symbol : class Excetion

location: class eaitest.vip.firmorder.FirmOrderBean_g8ghds__WebLogic_CMP_RDBMS

} catch (Excetion ex) {

可以看到明显“Excetion”拼写错误。而这段代码是WORKSHOP自动生成。但是,在某些机器上,同样的工程文件,编译就能通过。联系BEA工程师,也不能解决此问题。

笔者查阅大量资料,很难找到相关问题的介绍。一次在偶然查阅SUN的缺陷库[i]时,发现是由于GB18030中文编码问题所致。

2. 问题分析
国家标准GB18030-2000《信息交换用汉字编码字符集基本集的扩充》是我国继GB2312-1980和GB13000-1993之后最重要的汉字编码标准,是我国计算机系统必须遵循的基础性标准之一。国家质监总局规定GB 18030过渡期(即2001年8月31日)后正式发布或出厂的产品,必须符合GB-18030相关要求。

操作系统默认内部编码一般并不是GB18030,目前已知在WINDOWS XP操作系统中,进行某些组件的升级后,会把操作系统的默认编码由GB2312变更为GB18030。

但是即便在最新发布的JDK1.4.2_06版本中,对其支持仍存在一定问题。GB18030问题主要表现是,基于java的应用,涉及GB18030编码与其它编码方案转换时,存在字符丢失现象。

问题的原因是java在处理由sun.nio.cs.ext.ExtendedCharsets提供的扩展字符集时,会进行字符缓冲。但是对于缓冲字符没有采用新的sun.nio.cs.ext包处理,而是延用原有处理方式,这种方式在多线程操作下对GB18030编码方案处理存在问题,这样导致部分字符丢失。

此问题只影响GB18030编码方案,对GB2312等中文编码方案并没有影响。

当操作系统默认编码方案为GB18030时,假如进行文件写操作,未指定编码方案情况下,java采用操作系统默认编码方案操作,这时最轻易出现GB18030问题。

查看操作系统默认编码,可以运行如下java程序:

public class EchoDefaultSystemEncoding{

public static void main(String[] args){

String encoding=System.getProperty(“file.encoding”);

System.out.println(“Default System Encoding: ” + encoding);

}

}

在用WORKSHOP开发CMP EJB出现问题的操作系统默认编码即为GB18030。

由于碰到此问题的人比较少。而真正碰到时,很多人通过重新安装操作系统可以解决问题,因而这方面的资料很难找到。

3. 解决办法
最理想的解决办法就是由SUN修正此BUG。此问题早在2003年11月即提出,但是直到目前(2004/12/30),问题状态仍为“In process, bug”。

替代的解决方案主要思路是避开GB18030编码,主要有两种方法

改变操作系统默认编码方案

对于unix/Linux平台,修改操作系统编码方案很简单。如在solaris平台下,运行如下命令即可改变系统编码:

LANG=zh.GBK;export LANG

对于windows平台,修改操作系统中文默认编码比较复杂。尝试把操作系统的“区域和语言选项”更改为其它地区,选用其它语言,都没有效果。与微软客户服务联系,也不能提供相应解决方案。

运行java应用时指定默认编码

在运行基于JAVA的应用时,加上参数:

java ?CDfile.encoding=GB2312

把java应用的默认编码方案与GB2312硬绑定,即在未指明编码方案时,采用GB2312编码。

假如针对每个应用,进行上述修改,工作量很大。有些应用里面又隐式调用外部JAVA应用,更增加修正的难度。比较可行的办法是对java的运行文件进行修正,令其在运行时自动加上“-Dfile.encoding=GB2312”参数。

建议windows平台采用本方法进行修正。方案如下:

1、改名原java.exe,javaw.exe,如改为javabak.exe,javawbak.exe

2、重写java.exe和javaw.exe,令其运行时调用javabak.exe,javawbak.exe,并在运行时加上“-Dfile.encoding”参数。

如下c代码即可完成上述功能:

#include "string.h"

#include "stdlib.h"



int main(int argc, char* argv[])

{

char arg[100000] = "javabak.exe -Dfile.encoding=GB2312 ";

for(int i=1; i<argc; i++){

strcat(arg,argv[i]);

strcat(arg, " ");

}

system(arg);

return 0;

}

编译后(注重修改arg值),生成的文件命名为java.exe和javaw.exe,放置在<JAVA_HOME>/bin和<JAVA_HOME>/jre/bin目录下,即可。

经实践,此办法可以解决GB18030问题,并且不会带来其它隐患。唯一的缺点是在运行JAVA应用时,会有一个额外的DOS窗口打开,此窗口可以关闭,不会对应用运行带来影响。

4. 总结
在应用开发中,中文编码一直是一个比较麻烦的问题。尽管目前GB18030是国家强制性标准,有着各种各样的优点,但由于其推出时间尚短,在应用方面对其支持还不够完善,还是应尽可能采用GB2312等兼容性比较强的中文编码方案。

本文给出的解决方案,不仅适用于解决JAVA平台对GB18030支持问题,而且,也为指定通用JAVA运行默认参数,提供了另一种思路。



--------------------------------------------------------------------------------

参考文献

[i] http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4954023
上一篇:Java纵横谈 人气:458
下一篇:JAVA专业术语集 人气:484
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-11-19 飞天论坛FTBBS PHP v5.6 build 0
2008-11-19 飞天论坛FTBBS PHP v5.6 build 0
2008-11-19 PBDigg v2.0 Build 081118 周年版
2008-11-19 飞天论坛FTBBS PHP v5.6 build 0
2008-11-19 Seeknove v1.0.8
2008-11-19 PHP在线考试系统PPFRAME v1.2.9
2008-11-19 老Y文章管理系统 v2.2 bulid 081
2008-11-19 shopd1网店系统 v1.2
2008-11-19 仿webmasterhome 网站收录查询 v
2008-11-15 BitTorrent 6.1.2 Build 13185
2008-11-15 BitComet 1.06
2008-11-15 SpeedFan 4.36 Final
2008-11-15 Windows Installer CleanUp Util
2008-11-15 Safari 3.2
2008-11-15 RealPlayer 11.0.0.835 简体中文
2008-11-15 QQ for Mac Preview 3 Build 394
2008-11-15 Vista优化大师3.20
2008-11-15 酷点 CoolDock 0.6
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成