/**  编码问题测试总结:
一、要点: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"));
}


}
Logo

更多推荐