|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
再举这样一个例子:如果你想对一个数字取绝对值,你会怎么做呢?java的做法是intc=Math.abs(-166);而ruby的做法是:c=-166.abs。呵呵,这就看出了java与ruby的区别。编码|中文1.弁言
在用JAVA举行开辟时,偶然在IO操纵中会发生字符丧失征象。如在用BEA的WORKSHOP开辟CMPEJB过程当中,老是编译欠亨过,报错:
cannotresolvesymbol
symbol:classExcetion
location:classeaitest.vip.firmorder.FirmOrderBean_g8ghds__WebLogic_CMP_RDBMS
}catch(Excetionex){
能够看到分明“Excetion”拼写毛病。而这段代码是WORKSHOP主动天生。可是,在某些呆板上,一样的工程文件,编译就可以经由过程。接洽BEA工程师,也不克不及办理此成绩。
笔者查阅大批材料,很难找到相干成绩的先容。一次在偶然查阅SUN的缺点库[i]时,发明是因为GB18030中文编码成绩而至。
2.成绩剖析
国度尺度GB18030-2000《信息互换用汉字编码字符集基础集的扩大》是我国继GB2312-1980和GB13000-1993以后最主要的汉字编码尺度,是我国盘算机体系必需遵守的基本性尺度之一。国度质监总局划定GB18030过渡期(即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程序:
publicclassEchoDefaultSystemEncoding{
publicstaticvoidmain(String[]args){
Stringencoding=System.getProperty(“file.encoding”);
System.out.println(“DefaultSystemEncoding:”+encoding);
}
}
在用WORKSHOP开辟CMPEJB呈现成绩的操纵体系默许编码即为GB18030。
因为碰到此成绩的人对照少。而真正碰到时,良多人经由过程从头安装操纵体系能够办理成绩,因此这方面的材料很难找到。
3.办理举措
最幻想的办理举措就是由SUN修改此BUG。此成绩早在2003年11月即提出,可是直到今朝(2004/12/30),成绩形态仍为“Inprocess,bug”。
替换的办理计划次要思绪是避开GB18030编码,次要有两种办法
改动操纵体系默许编码计划
关于unix/linux平台,修正操纵体系编码计划很复杂。如在solaris平台下,运转以下命令便可改动体系编码:
LANG=zh.GBK;exportLANG
关于windows平台,修正操纵体系中文默许编码对照庞大。实验把操纵体系的“地区和言语选项”变动为别的区域,选用别的言语,都没无效果。与微软客户服务接洽,也不克不及供应响应办理计划。
运转java使用时指定默许编码
在运转基于JAVA的使用时,加上参数:
javaCDfile.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"
intmain(intargc,char*argv[])
{
chararg[100000]="javabak.exe-Dfile.encoding=GB2312";
for(inti=1;i<argc;i++){
strcat(arg,argv[i]);
strcat(arg,"");
}
system(arg);
return0;
}
编译后(注重修正arg值),天生的文件定名为java.exe和javaw.exe,安排在<JAVA_HOME>/bin和<JAVA_HOME>/jre/bin目次下,便可。
经理论,此举措能够办理GB18030成绩,而且不会带来别的隐患。独一的弱点是在运转JAVA使用时,会有一个分外的DOS窗口翻开,此窗口能够封闭,不会对使用运转带来影响。
4.总结
在使用开辟中,中文编码一向是一个对照贫苦的成绩。只管今朝GB18030是国度强迫性尺度,有着林林总总的长处,但因为其推出工夫尚短,在使用方面临其撑持还不敷完美,仍是应尽量接纳GB2312等兼容性对照强的中文编码计划。
本文给出的办理计划,不但合用于办理JAVA平台对GB18030撑持成绩,并且,也为指定通用JAVA运转默许参数,供应了另外一种思绪。
但是一些大型开发或者是保密型比较高的项目都会用java,原因有2点,一:java是开源的,不怕别人留后门,偷我工具,.net就不一样了,保持微软的一向风格,源代码不公开 |
|