Java里面String的編碼問題


Java里面內置字符串全部是utf-16編碼,詳細的編碼方式看這里

import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.Map;

public class String2Bytes {
    public static void main(String[] args) {
        String str = "\u005Bab我";
        Map<String, Charset> charsetMap = Charset.availableCharsets();
        for(String charsetName : charsetMap.keySet()) {
            System.out.println(charsetName + ":" + charsetMap.get(charsetName));
        }
        System.out.println(str.charAt(3));
        //String的getBytes()方法是得到一個字串的字節數組,這是眾所周知的。
        //但特別要注意的是,本方法將返回該操作系統默認的編碼格式的字節數組。
        //如果你在使用這個方法時不考慮到這一點,你會發現在一個平台上運行良好的系統,放到另外一台機器后會產生意想不到的問題。
        System.out.println(Arrays.toString(str.getBytes()));
        
        //附加級別的字符
        char[] c = Character.toChars(Integer.parseInt("1D306", 16));
        String str1 = new String(c);
        System.out.println(str1);
        //附加級別的字符占用了2個代碼單元
        System.out.println(c.length);
        System.out.println(str1.length());
        //但是只占用一個代碼點
        System.out.println(str1.codePointCount(0, str1.length()));
        
        //訪問第一個代碼單元,這種做法是錯誤的
        System.out.println(str1.charAt(0));
        
        //查看保存在內存里的方式
        /*
         * 算法
         * H = Math.floor((c-0x10000) / 0x400)+0xD800
         * L = (c - 0x10000) % 0x400 + 0xDC00
         */
        System.out.println(Integer.toString((int)str1.charAt(0), 16));//0xD834
        System.out.println(Integer.toString((int)str1.charAt(1), 16));//0xDF06
        
        //訪問第一個代碼點,正確的做法
        int index = str1.offsetByCodePoints(0, 0);
        System.out.println(str1.codePointAt(index));
        
        String str2 = str1 + "abc";
        //順序訪問一個String正確的方式
        int count = str2.codePointCount(0, str2.length());
        for(int i=0; i < count; ++i) {
            int index1 = str2.offsetByCodePoints(0, i);
            int cp = str2.codePointAt(index1);
            System.out.print(Character.toChars(cp));
        }
        System.out.println();
    }
}

 


免責聲明!

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



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