3.1 Unicode ----Jvm是unicode编码及验证

*Programs are written using the Unicode character set. Information about this character set and its associated character encodings may be found at http://www.unicode.org/.
The Java SE platform tracks the Unicode Standard as it evolves. The precise version of Unicode used by a given release is specified in the documentation of the class Character.*
这里的编码是指jvm的运行时期的编码为unicode。unicode默认是16bit。java使用的是unicode16编码。java的编码是统一的,具体t体现是加载到内存统一。
注意:Unicode只是一个符号集,他只规定数据是按何种规则存储(unicode有多中存储方式)。utf-8是unicode一个实现,他指定了对应的值映射的内容。
java的编码(class)是取决于运行环境的编码,如果系统是xp可能就是gbk,windows可能是utf-8,ubuntu可能是unicode,这里的编码。
如何证明jvm是utf-16?
思路:取出一个字符的字节码表示,将这个字符转换成某个格式,然后再取其直接码表示,如果两个字节码相等,则说明该字符是这个格式

public static String byteToBinary(byte src) {
    StringBuilder result = new StringBuilder();
    for (int i = 0; i < 8; i++) {​
        result.append(src%2 == 0 ? '0' : '1');
        src = (byte)(src >>> 1);
    }
    return result.reverse().toString();
}

public static void main(String[] args) throws UnsupportedEncodingException {
    String str = "测试运行时string的编码";
    byte[] utf16 = str.getBytes("UTF-16");  //一个byte等于8个字节
    System.out.println(Arrays.toString(utf16));
    for (int i = 0; i < str.length(); i++) {
        System.out.println(str.charAt(i));  //输入当前字节
        byte high = (byte)(str.charAt(i) >>> 8);  //转换前8位
        byte low = (byte) str.charAt(i);    //转换前后8位
        System.out.println(byteToBinary(high) + byteToBinary(low));
        System.out.println(byteToBinary(utf16[2+2*i]) + byteToBinary(utf16[2+2*i+1]));    //转换后16位
        System.out.println((byteToBinary(high) + byteToBinary(low)).equals(byteToBinary(utf16[2+2*i]) + byteToBinary(utf16[2+2*i+1])));//相等则说明是utf-16
    }
}

你可能感兴趣的:(java语言规范8,unicode,java)