字符串轉碼中文亂碼問題的進一步理解 UTF-8 GBK轉碼


            首先 要明確指出一點:

                   編碼方式是針對字符串轉換之后的字節數組的,字符串並沒有編碼方式的概念,因為字符串不管是在什么編碼頁面下他只是一個對象,他只有字符的概念,不管頁面編碼方式是什么,他始終都是那幾個字符    

                眾所周知,字符編碼很多  像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




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM