Java中文编码转换

不能全局替代错误谬误:跨平台性差。

 Java中文编码转换阐发

遇到中文成绩的来源个体都是jsp等显示到页面时,凡是。出现成绩。

就要从了解jsp--->servlet--->class起头若想知晓为什么出现乱码。

成就首要在servlet --->class上,实在。也就是 javac<*.java>文件时出现了成绩,

兴许你要问为什么?www.rhsgdt.com这就是下面要和大家讨论的

大家要清楚java内核是unicod就连class文件也是而后,起首。一般操纵中很多都是操纵字节流的包含文件流的保存体式格局。是以java要对此履行转换。

char ----------  unicode  

byte ----------  字节

java中的byte/char互转的函数在sun.io包中。

publicstaticbytetocharconvertgetdefault;

publicstaticbytetocharconvertgetconvertstringencod;

若是你向convert指定encod则系统会自动操纵当面的encodgb平台上用gbken平台上用 8859_1

中文xp系统下的一段代码:上面。

importjava.io.FileWriter;

importjava.io.IOException;

publclasstestEncod{

   publicvoidtest{

          Stringstr="";

          try{

          FileWritwrite=newFileWrit"test.txt";

          write.writstr;

          write.clos;

          }catchIOExceptione{

              System.out.println"hanotfoundtest.txtfile!";     

          }   

   }   

   publicstaticvoidmainString[]arg{

          testEncodinstanc=newtestEncod;

          instance.test;

   }   

}   

//javac-encodgbk/iso8859-1/utf-8 [罕用的编码体式格局]www.jsnjdc.com

默认不消-encod编译 和 选用 -encodgbk都是正常显现 //测试成果。

//如果用 -encodutf-8/ios8859-1则显示乱码 ??

阐发:String和byte[]

如果操纵分歧的编码, String其实焦点是char[]然则要把byte转化成String或String--->byte必须经过编码。string.length其实就是char数组的长度。很可以或许会错分,造成散字和乱码。就犹如上面例子中,错用javac–encodios8859-1testEncoding.java后,运行后文件中显示 ??一样。

阐发:readerwriter/inputstreamoutputstream

 reader和writer焦点是charinputstream和outputstream焦点是byte但是reader和writer重要目的要把char读/写inputstream/outputstream这里用不同的编码格式会对功效造成不一样的影响。

阐发:javac–encod参数

 时常没有用到encod这个参数。实在encod这个参数对于跨平台的操纵是很重要的

如果没有指定encod则按照系统的默许encodgb平台上是gb2312英文平台上是iso8859_1

对文件履行编译,这个类的compil函数中间有一个encod变量,--java编译器实际上是挪用sun.tools.javac.main类。-encod参数其实直接传给encod变量。编译器就是遵照这个变量来读取java文件的尔后按照设定的encod格式编译成class文件www.njxzc.com。

总结:

那编码格式无所谓,若是我只是自己写一个或2个文件。怎么处置惩罚都可以,但是对于斥地职员,面临的凡都是一个庞大的体系,快平台也是很正常的以是在编码格式上很难全局控制,一个企业化的处置惩罚打算就是系统中,不管htmljspjava只有是中文,都不要直接输出,采用本钱串的方式来编写。这样才能形成真正的产物。

中文/英文资源串 可以或许操纵 java.util.Properties; 来处理 

也可以利用 org.apache.struts.util.MessageResourc来处理 若是你系统撑持struts.

把持本钱串处理中英文字符成就尚有别的4个好处:

为了模块自力,[1]很多地方的本钱串都是可以或许频频利用的固然。不合模块就算异样的字符也建议在分歧的本钱串文件写)

只要改写一个地方就ok[2]当很多地方的赞同个字符串必要改削时。

那么,[3]如果要求系统支撑中英文转换。只有在展现本钱串时根据local鉴定就可以了

有很好的平台移植性,[4]编码转换上。不用每次都考虑服务器上的编码体式格局,当地的编码体式格局,尔后再写n个转换库。机能是也会有一定的影响。

另外大家必要注重我罕用的操纵服务器tomcat默认编码花式:iso8859-1

定义地位:tomcat下的web.xml第一行:

<?xmlversion="1.0"encoding="ISO-8859-1"?>

很多操纵服务器都必要打包宣布,凡系统斥地后。首推工具当然是ant好东西啊!

设定编码体式格局:用ant编译系统时。

<!--================================================================-->

 <!--Compilthejavasourccodein thelocal                                     -->

<!--================================================================-->

<targetname="compile.java"depends="prepare">

       <javacencoding="${encoding}"destdir="${build.dir}/WEB-INF/classes"debug="on"deprecation="off"optimize="off"

           srcdir="${webapp.path}/WEB-INF/classes"classpathref="run.classpath">

           <includname="com/**/*.java"/>

       </javac>

       <copitodir="${build.dir}/WEB-INF/classes/com/neusoft/ehr/replets/standard">

           <filesetdir="${src.dir}/WEB-INF/classes/com/neusoft/ehr/replets/standard"includes="**/*.srt"/>

       </copy>

</target>

jsp全部经由过程现在任务的系统中。

<%@pagecontentType="text/html;charset=UTF-8"%>  指定编码体式格局

全数系统不管在页面,从上到下。编译,都采用相同的编码花式(UTF-8

但必定要统一(不然,固然你也可以或许遵照本身的必要设定本身的花式。有很多成就会找你

抉择UTF-8起因:大部分浏览器ie其高档设置中始终以utf-8发送url选项缺省是选上的

用Eclips来斥地系统平台,以我系统举例。斥地时,凡为了点窜bug都要在本地直接用本地源代码履行系统宣布,如果此时在java中直接写中文,中文系统是没问题,但如果用设定了utf-8ant编译后,就会出现中文,由于Eclips默许的编码体式格局是GBK就像我第一个例子中说的那样

javac-encodgbk/utf-8 展现出了分歧。

不用本钱串的项目事例:

也多提一下,此。已经在上海财大,公司其他部分的兄弟们作了个系统,也是很大的体系,但是全数系统都没有采用本钱串,直接用中文,接纳的体式格局大约是

1 得到服务端的编码体式格局

2 得到用户端的编码体式格局

对编码格式履行转换3 写n个转换库。

比方 HPUnix经常必要设定服务器的环境变量,4 很多服务器。以处理编码)

改的时刻也可以长处:写的时刻很方便。

posted @ 2011-05-11 15:45  feipanding  阅读(1999)  评论(0编辑  收藏  举报