首先 要明確指出一點:html
編碼方式是針對字符串轉換以後的字節數組的,字符串並無編碼方式的概念,由於字符串無論是在什麼編碼頁面下他只是一個對象,他只有字符的概念,無論頁面編碼方式是什麼,他始終都是那幾個字符 數組
衆所周知,字符編碼不少 像UTF-八、GBK、GB23十二、ISO8859-1等等 其中GBK是兼容GB2312的 編碼
重點是UTF-8編碼下的中文佔3個字節,GBK、GB2312編碼下的中文佔2個字節,當咱們把一個字符串解析爲UTF-8的字節時,spa
若是進行了業務處理,再轉爲GBK那麼很容易就出現了亂碼,很顯然兩種編碼中文字節佔用位數都不同,code
網上不少人說GBK轉UTF-8的方法以下:htm
//如下代碼是錯誤的
String str="雙節棍愛好友h爲太原"; byte[]tem=str.getBytes("GBK"); String result=new String(tem,"UTF-8");
我能夠很負責的說這個是錯誤的 結果是亂碼 這個我已經試過 是錯誤的對象
字符串就是個對象 你用什麼編碼去獲取字節數組,那麼你將字節數組從新還原字符串的時候就用對應的編碼blog
//正確的方式
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");
或者:get
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