`
执着IT路
  • 浏览: 46490 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

浅析java字符串转码

阅读更多

经过前一个项目的实践,我发现java平台里其实所有编码的字符串都可以正常显示,代码例如下

String strDefalt = "";
String strDefaltEncode = "";
String strChangeEncode = "";
try {
	strDefalt = "我的心不乱";
	strDefaltEncode = new String("我的心不乱".getBytes(),"gbk");
	strChangeEncode = new String("我的心不乱".getBytes("shift-jis"),"shift-jis");
} catch (UnsupportedEncodingException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}
System.out.println("Default charsetName="+Charset.defaultCharset().name());
System.out.println("strDefalt="+strDefalt);
System.out.println("strDefaltEncode="+strDefaltEncode);
System.out.println("strChangeEncode="+strChangeEncode);
 

运行结果为:

Default charsetName=GBK
strDefalt=我的心不乱
strDefaltEncode=我的心不乱
strChangeEncode=我的心不乱
 

第一个显示的charsetName是我想打出我自己的平台里java默认的编码类型。

从而推测出第二行所表示的也就是strDefalt的字符串的编码类型为gbk。

根据第二行的推测重新将汉字转码为gbk,从而确认平台的默认编码为gbk。

而第三行,是我通过字符串转码将汉字【我的心不乱】由gbk编码转换为【shift-jis】的编码。

 

如上所示,默认的gbk的编码和shift-jis编码的汉字都可以正常的显示出来的

证明的确在平台中不同编码的字符可以正确的显示出来。

 

   既然不同的汉字都可以正常的显示出来,那么我们为什么有字符串乱码的情况呢。

那么我们来简单的列举下,一般都是什么情况下会出现乱码呢,据我目前的项目经历,我的答案是从数据库中取字符和在     web项目中request给我的字符,那么这2种情况,我可以归结为这不是我在程序中所定义的字符,这些字符都是我在外界取到的。众所周知,java的输入输出都是byte流的,而我们所取到的字符都是java平台自己将byte数据通过平台默认的编码形式将byte转换为String的。所以在这种情况下就会出现乱码。

 

知道了原理,那么解决问题也就很简单了,那就是在byte被转化为String之前指定它的编码形式就可以了。

但有些时候我们无法再平台转码之前指定编码形式,这种情况下也是有办法的。。呵呵,,看下如下代码。

 

 

String strDefalt = "";
String strDefaltEncode = "";
String strChangeEncode = "";
try {
	strDefalt = "我的心不乱";
	strDefaltEncode = new String("我的心不乱".getBytes(),"iso-8859-1");
	String temp = new String(strDefaltEncode.getBytes("iso-8859-1"),"gbk");
	System.out.println("temp="+temp);
	strChangeEncode = new String(temp.getBytes("shift-jis"), "shift-jis");
} catch (UnsupportedEncodingException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}
System.out.println("Default charsetName="+Charset.defaultCharset().name());
System.out.println("strDefalt="+strDefalt);
System.out.println("strDefaltEncode="+strDefaltEncode);
		
System.out.println("strChangeEncode="+strChangeEncode);

 显示结果如下

temp=我的心不乱
Default charsetName=GBK
strDefalt=我的心不乱
strDefaltEncode=??????????
strChangeEncode=我的心不乱

 除了第四行显示为乱码外,其他的都正常的显示了

乱码的原因是我将gbk编码的String错误的转化为了iso-8859-1编码所以出乱码了。

第四行字符正常显示的一个原因为我将乱码的String(也就是第四行所显示的String)还原为原先的Byte(组装成String之前的),然后再用完好的Byte转化为默认编码形式的String(第一行所表示的String)。而最后一行就是将完好的String在转化为自己想要的shift-jis的编码的String了

其转换的原理为所谓的转码其实也就是不同的字符编码的字符集的映射顺序不同。

比如在a编码中1281可能对应的是【我】而在b编码中1281对应的是【%】所以这就出先字符的乱码现象,

而将数字转化成字符,则首先要获得目的编码数字,在映射成相应的字符。上面的字符为默认的gbk码的数字(byte)被错误的映射成了iso-8859-1字符,所以乱码了,要转换回来的话,首先要获得gbk的数字,所以将错误的iso-8859-1字符转换为iso-8859-1数字,然后再用这gbk的数字转换成gbk的字符,再用gbk的字符转化为shift-jis的字符。

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics