/** 编码问题测试总结:
一、要点:1、数据库编码,2、java中的编码, 3、java获取数据库数据进行转码
二、数据库中的编码问题(以我最近使用过的mysql为例子):
1、应用程序获取数据库数据时,以character_set_db为标准。
比如:character_set_db为latin1(ISO-8859-1),而应用程序为utf-8,则会乱码。与character_set_client无关
2、数据库管理工具(包括命令行)上查看数据:
character_set_db与character_set_client编码要对应,否则会出现乱码
其实以上两点是统一的,也就是说:存储的是什么编码的数据,(应用程序或命令行)取出来的也要用什么编码,
就比如你使用存的是人民币,取出来是美金。数目上肯定是不一样的(虽然价值一样)。
三、java中的编码测试:
1、encodeTrans:各种编码间的转换,并将转换后的数据再进行逆编码
1、结果可知获取的汉字字节编码长度各不一致
2、编码再逆编码之后是不一致的,可见编码是不可逆的
可得出:java开始时以默认编码unicode进行存储,
a、getBytes时通过指定的字符集,到相应的字符集库进行搜索匹配的字节编码。
当然unicode与utf8可根据运算获取,无需使用这一步。
b、字节码重新 组合成 字符串时,如果以另外一个字符集进行编码时,会因为字符集的编码规则不一致而找不到相应的字符,变成乱码
c、出现乱码的字符串,再进行逆编码,由于乱码中可能有一个字符在字符集中找不到对应的编码,以ISO-8859-1为例,就保存为63(?的编码)
这种编码已经失真,便无法再还原为原来的字节码。
而部分未失真的编码依然可以还原为原来的字符串。
四、所以不要指望通过java转码可以完全无误:
数据库iso-8859-1 ——> java取出来getbytes(iso-8859-1) ——> new String("","utf-8");
这种转码要达到预期的效果是不合实际的
五、如果有错误的地方请指正,谢谢
* */ public class CharsetTest { private static String charStr = "測試傳統字符"; /** * @throws Exception * @description 各种编码转换 * @version 1.0 * @author * @update 2013-11-3 下午12:28:43 */ public static void encodeTrans() throws Exception{ String[] charactersets = {"unicode","utf-8","gb2312","gbk","gb18030","ISO-8859-1","utf-16"}; for(int i = 0; i < charactersets.length; i ++){ System.out.println("*****"+charactersets[i]+"转码开始******"); /**********根据字符集获取字节开始****************/ byte[] bytes = charStr.getBytes(charactersets[i]); System.out.print("getOutCharacter:"+charactersets[i] + ";values:"); for(int temp = 0; temp < bytes.length; temp ++) System.out.print(bytes[temp] + " "); System.out.println(); /**********根据字符集获取字节结束****************/ /**********输出转码结果开始****************/ for(int j = 0; j < charactersets.length; j ++){ String setStr = new String(bytes,charactersets[j]); System.out.println(charactersets[i]+" To "+charactersets[j]+":"+setStr); System.out.println("编码还原:\n"+charactersets[j]+" To "+charactersets[i]+new String(setStr.getBytes(charactersets[j]),charactersets[i])); } System.out.println("*****"+charactersets[i]+"转码结束******"); } } public static void main(String[] args) throws Exception { // encodeTrans(); byte[] bytes = charStr.getBytes("utf-8"); System.out.print("getOutCharacter:"+"utf-8" + ";values:"); for(int temp = 0; temp < bytes.length; temp ++) System.out.print(bytes[temp] + " "); System.out.println(); byte[] newbytes = new String (bytes,"gb2312").getBytes("gb2312"); System.out.print("getOutCharacter:"+"utf-8" + ";values:"); for(int temp = 0; temp < newbytes.length; temp ++) System.out.print(newbytes[temp] + " "); System.out.println(); System.out.println(new String (newbytes,"utf-8")); } }
转载自:http://blog.csdn.net/jiangxuexuanshuang/article/details/14112859