仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1738|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA网页设计Java字符丧失与中文编码

[复制链接]
山那边是海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:40:36 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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就不一样了,保持微软的一向风格,源代码不公开
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-23 20:29

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表