首先 要明確指出一點:
編碼方式是針對字符串轉換之后的字節數組的,字符串並沒有編碼方式的概念,因為字符串不管是在什么編碼頁面下他只是一個對象,他只有字符的概念,不管頁面編碼方式是什么,他始終都是那幾個字符
眾所周知,字符編碼很多 像UTF-8、GBK、GB2312、ISO8859-1等等 其中GBK是兼容GB2312的
重點是UTF-8編碼下的中文占3個字節,GBK、GB2312編碼下的中文占2個字節,當我們把一個字符串解析為UTF-8的字節時,
如果進行了業務處理,再轉為GBK那么很容易就出現了亂碼,很顯然兩種編碼中文字節占用位數都不一樣,
網上很多人說GBK轉UTF-8的方法如下:
//以下代碼是錯誤的
String str="雙節棍愛好友h為太原"; byte[]tem=str.getBytes("GBK"); String result=new String(tem,"UTF-8");
我可以很負責的說這個是錯誤的 結果是亂碼 這個我已經試過 是錯誤的
字符串就是個對象 你用什么編碼去獲取字節數組,那么你將字節數組重新還原字符串的時候就用對應的編碼
//正確的方式
String name="金黃色的sfdf弗蘭克的但safd撒酒瘋"; byte[] gbkBytes=name.getBytes("GBK"); System.out.println(new String(gbkBytes,"GBK")); byte[] utfBytes=name.getBytes("UTF-8"); System.out.println(new String(utfBytes,"UTF-8"));
如果要把字符串轉換為UTF-8的字節數組 可以用以下兩種方法:
byte[] retString=name.getBytes("UTF-8");
或者:
public static byte[] getUTF8Bytes(String name) { int n = name.length(); byte[] utfBytes = new byte[3 * n]; int k = 0; for (int i = 0; i < n; i++) { int m = name.charAt(i); if (m < 128 && m >= 0) { utfBytes[k++] = (byte) m; continue; } utfBytes[k++] = (byte) (0xe0 | (m >> 12)); utfBytes[k++] = (byte) (0x80 | ((m >> 6) & 0x3f)); utfBytes[k++] = (byte) (0x80 | (m & 0x3f)); } if (k < utfBytes.length) { byte[] tmp = new byte[k]; System.arraycopy(utfBytes, 0, tmp, 0, k); return tmp; } return utfBytes; }
嚴禁盜版
轉載請注明出處:https://www.cnblogs.com/bimingcong/p/9185472.html