程序中有漢字參數,經常會遇到編碼轉碼問題,總結下:
1.漢字為多字節字符,須多字節編碼解碼,如"測試".getBytes("gb2312");
這樣"測試".getBytes("gb2312")就變成一個byte數組,這時候你可以隨意重新指定編碼如iso-8859-1,
String s1=new String("測試".getBytes("gb2312"),"iso-8859-1");
編為s1,這是s1就變成一個是iso-8859-1編碼的字符串,如果你想重新轉為中文,那么,你用什么字符集編碼的,必須用什么字符集來解 碼,這里是iso-8859-1,可以這么來做
String s2 = new String(s1.getBytes("ISO-8859-1"),"gb2312");
這樣s2又重新變回中文了,所以當你打印s2時,就是“測試”。
2.用iso-8859-1做中間編碼,原因:
[1]iso-8859-1是單字節字符編碼,
[2]ANSI 編碼 (如:GB2312, BIG5,Shift_JIS,ISO-8859-2等等),是多字節編碼(英文單字節,中文多字節);
[3]UNICODE 編碼(UTF-8, UTF-7, UTF-16, UnicodeLittle, UnicodeBig....),是寬字節編碼(所有字符均是多字節)
因此用iso-8859-1做中間碼,會保持原有字節的秩序,不發生混亂;可以理解為其他的編碼對iso-8859-1兼容吧。
因此,我們常常使用 bytes = string.getBytes("iso-8859-1") 坐中間碼來進行逆向操作,得到原始的“字節串”。然后再使用正確的ANSI 編碼,比如 string = new String(bytes, "GB2312"),來得到正確的“UNICODE 字符串”。
不信的話可以試試,utf8和gb不能互相轉換,只有iso-8859-1做中間碼可以完美互相轉碼!!!
1.漢字為多字節字符,須多字節編碼解碼,如"測試".getBytes("gb2312");
這樣"測試".getBytes("gb2312")就變成一個byte數組,這時候你可以隨意重新指定編碼如iso-8859-1,
String s1=new String("測試".getBytes("gb2312"),"iso-8859-1");
編為s1,這是s1就變成一個是iso-8859-1編碼的字符串,如果你想重新轉為中文,那么,你用什么字符集編碼的,必須用什么字符集來解 碼,這里是iso-8859-1,可以這么來做
String s2 = new String(s1.getBytes("ISO-8859-1"),"gb2312");
這樣s2又重新變回中文了,所以當你打印s2時,就是“測試”。
2.用iso-8859-1做中間編碼,原因:
[1]iso-8859-1是單字節字符編碼,
[2]ANSI 編碼 (如:GB2312, BIG5,Shift_JIS,ISO-8859-2等等),是多字節編碼(英文單字節,中文多字節);
[3]UNICODE 編碼(UTF-8, UTF-7, UTF-16, UnicodeLittle, UnicodeBig....),是寬字節編碼(所有字符均是多字節)
因此用iso-8859-1做中間碼,會保持原有字節的秩序,不發生混亂;可以理解為其他的編碼對iso-8859-1兼容吧。
因此,我們常常使用 bytes = string.getBytes("iso-8859-1") 坐中間碼來進行逆向操作,得到原始的“字節串”。然后再使用正確的ANSI 編碼,比如 string = new String(bytes, "GB2312"),來得到正確的“UNICODE 字符串”。
不信的話可以試試,utf8和gb不能互相轉換,只有iso-8859-1做中間碼可以完美互相轉碼!!!