字符集编码
Unicode編碼?
最初的unicode編碼是固定長度的,16位,也就是2兩個字節代表一個字符,這樣一共可以表示65536個字符。顯然,這樣要表示各種語言中所有的字符是遠遠不夠的。Unicode4.0規范考慮到了這種情況,定義了一組附加字符編碼,附加字符編碼采用2個16位來表示,這樣最多可以定義1048576個附加字符。所以4個字節表示一個字符。
Unicode只是一個編碼規范,目前實際實現的unicode編碼有:UTF-8,UTF-16等。utf-8是考慮了字符是怎么存儲在計算機上。
UTF-8
utf-8是一種可變長的編碼方式,使用1~6個字節表示一個符號,根據不同的符號調整字節數量。
//ascii字符 1個字節 // byte[] bytes = "a".getBytes("utf-8"); // System.out.println(bytes.length); //1//希臘文2個字節 // byte[] bytes = "α".getBytes("utf-8"); // System.out.println(bytes.length); //2//中文3個字節 // byte[] bytes = "中".getBytes("utf-8"); // System.out.println(bytes.length); //3//中文4個字節(ckj中韓日擴展表意字符) // byte[] bytes = "?".getBytes("utf-8"); // System.out.println(bytes.length); //4
?
utf-8的可變長字節編碼
這是種比較巧妙的設計,如果一個字節的第一位是0,則這個字節單獨就是一個字符;如果第一位是1,則連續有多少個1,就表示當前字符占用多少個字節。
以"嚴"的編碼字節數組為例,二進制表示為11100100 10111000 10100101
第一個字節開頭有三個連續的1,表示該字符占用三個字節
byte[] bytes = "嚴".getBytes("utf-8"); //得到utf-8編碼StringBuffer sb = new StringBuffer();for(int i =0 ;i<bytes.length ;i ++) {sb.append(Integer.toBinaryString((bytes[i] & 0xFF) + 0x100).substring(1));if(i != bytes.length - 1) {sb.append(" ");}}System.out.println(sb.toString()); //11100100 10111000 10100101
字符a的二進制編碼是?01100001 , 開頭是0,表示該字節單獨表示一個字符
byte[] bytes = "a".getBytes("utf-8");StringBuffer sb = new StringBuffer();for(int i =0 ;i<bytes.length ;i ++) {sb.append(Integer.toBinaryString((bytes[i] & 0xFF) + 0x100).substring(1));if(i != bytes.length - 1) {sb.append(" ");}}System.out.println(sb.toString()); //01100001
?
轉載于:https://www.cnblogs.com/moris5013/p/10608245.html
總結
- 上一篇: 求一个好听的霸道总裁名字
- 下一篇: 前端去掉空格的方法