首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Unicode,ISO-8859,GBK,UTF-8编码及互相转换(java)(转)

2012-12-28 
Unicode,ISO-8859,GBK,UTF-8编码及相互转换(java)(转)1、函数介绍在Java中,字符串用统一的Unicode编码,每个

Unicode,ISO-8859,GBK,UTF-8编码及相互转换(java)(转)

1、函数介绍在Java中,字符串用统一的Unicode编码,每个字符占用两个字节,与编码有关的两个主要函数为:

1)将字符串用指定的编码集合解析成字节数组,完成Unicode-〉charsetName转换
public byte[] getBytes(String charsetName) throws UnsupportedEncodingException 

2)将字节数组以指定的编码集合构造成字符串,完成charsetName-〉Unicode转换
public String(byte[] bytes, String charsetName) throws UnsupportedEncodingException

2、Unicode与各编码之间的直接转换下面以对中文字符串"a中文"的编码转换为例,来了解各种编码之间的转换

1)Unicode和GBK
测试结果如下,每个汉字转换为两个字节,且是可逆的,即通过字节可以转换回字符串
String-GBK〉ByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4
ByteArray-GBK〉String:0x61 0xD6 0xD0 0xCE 0xC4-〉\u0061\u4E2D\u6587(a中文)

try {String abcd = "a中文";//或者使用abcd = "\u0061\u4E2D\u6587";String utf_8 = new String(abcd.getBytes("gbk"),"utf-8");//过渡乱码:a????String gbk = new String(utf_8.getBytes("utf-8"),"gbk");byte[] bt1 = abcd.getBytes("gbk");//[97, -42, -48, -50, -60]byte[] bt2 = utf_8.getBytes("utf-8");//[97, -17, -65, -67, -17, -65, -67, -17, -65, -67, -17, -65, -67]System.out.println(utf_8);//乱码:a锟斤拷锟斤拷} catch (UnsupportedEncodingException e) {e.printStackTrace();}

?

4、编码过程中错误诊断参考

1)一个汉字对应一个问号
在通过ISO-8859-1从字符串获取字节数组时,由于一个Unicode转换成一个byte,当遇到不认识的Unicode时,转换为0x3F,这样无论用哪种编码构造时都会产生一个?乱码。

2)一个汉字对应两个问号
在通过GBK从字符串获取字节数组时,由于一个Unicode转换成两个byte,如果此时用ISO-8859-1或用UTF-8构造字符串就会出现两个问号。若是通过ISO-8859-1构造可以再通过上面所说的错上加错恢复(即再通过从ISO-8859-1解析,用GBK构造);若是通过UTF-8构造则会产生Unicode字符"\uFFFD",不能恢复,若再通过String-UTF-8〉ByteArray-GBK〉String,则会出现杂码,如a锟斤拷锟斤拷

3)一个汉字对应三个问号
在通过UTF-8从字符串获取字节数组时,由于一个Unicode转换成三个byte,如果此时用ISO-8859-1构造字符串就会出现三个问号;用GBK构造字符串就会出现杂码,如a涓 枃

?

载自:http://blog.csdn.net/wuzejun1275/archive/2009/09/28/4610716.aspx

热点排行