1. 程式人生 > >Java中utf-8格式字符串的存儲方法。

Java中utf-8格式字符串的存儲方法。

字節 turn byte[] spa 負數 oid 只有一個 ret 字符串截取



知識點:
可通過 byte[] bytes=“xxxx”.getBytes("utf-8")得到字符串通過utf-8解析到字節數組。utf-8編碼格式下,計算機采用1個字節存儲ASCII範圍內的字符,采用3個字節儲存中文字符。
UTF-8是一種變長字節編碼方式。對於某一個字符的UTF-8編碼,如果只有一個字節則其最高二進制位為0;如果是多字節,其第一個字節從最高位開始,連續的二進制位值為1的個數決定了其編碼的位數,其余各字節均以10開頭。UTF-8最多可用到6個字節。
如表:
1字節 0xxxxxxx
2字節 110xxxxx 10xxxxxx
3字節 1110xxxx 10xxxxxx 10xxxxxx
4字節 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字節 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字節 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

註意:計算中中utf-8編碼存儲多字節字符時,並未將8個二進制位的首位作為符號位,如直接輸出,得到的將是負數。
byte[] bss = "這是一個神奇的世界".getBytes("utf-8");
System.out.println("bss長度:"+bss.length);//輸出:27,一個中文用三個字節存儲。
        
        //輸出:-24 -65 -103 -26 -104 -81 -28 -72 -128 -28 -72 -86 -25 -91 -98 -27 -91 -121 -25 -102 -124 -28 -72 -106 -25 -107 -116 
 for (byte b:bss) {
      System.out.print(b+" ");
}

如要正確獲得每一個字節表示的實際編碼值。可通過如下方式。(需了解位移運算,原碼、反碼、補碼相關知識)

1.十進制

 byte[] bss = "這是一個神奇的世界".getBytes("utf-8");
        System.out.println("bss長度:"+bss.length);//輸出:27,一個中文用三個字節存儲。
        //輸出:232 191 153 230 152 175 228 184 128 228 184 170 231 165 158 229 165 135 231 154 132 228 184 150 231 149 140 
        for (byte b:bss) {
            System.out.print(Integer.valueOf(b
&0xff)+" "); }

2.十六進制

 byte[] bss = "這是一個神奇的世界".getBytes("utf-8");
        System.out.println("bss長度:"+bss.length);//輸出:27,一個中文用三個字節存儲。
        //輸出:e8 bf 99 e6 98 af e4 b8 80 e4 b8 aa e7 a5 9e e5 a5 87 e7 9a 84 e4 b8 96 e7 95 8c 
        for (byte b:bss) {
            System.out.print(Integer.toHexString(b&0xff)+" ");
        }

3.二進制

 byte[] bss = "這是一個神奇的世界".getBytes("utf-8");
        System.out.println("bss長度:"+bss.length);//輸出:27,一個中文用三個字節存儲。
        //輸出:11101000 10111111 10011001 11100110 10011000 10101111 11100100 
        // 10111000 10000000 11100100 10111000 10101010 11100111 10100101 10011110
        // 11100101 10100101 10000111 11100111 10011010 10000100 11100100 
        // 10111000 10010110 11100111 10010101 10001100
        for (byte b:bss) {
            System.out.print(Integer.toBinaryString(b&0xff)+" ");
        }

練習:中英文混合字符串截取

* 通過傳入字符串和字節素,根據字節數截取字串,utf-8下非英文字符占據多個字節,
* 如截取位置處於非英文字符的中間位置,應舍棄最後一個被截斷的字符。

  

public class StrTruncate {

    public static void main(String[] args) throws UnsupportedEncodingException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("輸入(字符串,字節數)");
        String inputStr = scanner.nextLine();

        String sub = new StrTruncate().getSubStr(inputStr.split(",")[0]
                , Integer.valueOf(inputStr.split(",")[1]));
        System.out.println("截取後的字符串為:" + sub);
    }

    public String getSubStr(String resource, int charLen) throws UnsupportedEncodingException {
        if (charLen <= 0) {
            return null;
        }
        byte[] bytes = resource.getBytes("utf-8");
        if (bytes[charLen] < 0) {
            while (!Integer.toBinaryString(bytes[charLen] & 0xff).startsWith("11")) {
                charLen--;
            }
        }
        String subStr = new String(bytes, 0, charLen, "utf-8");
        return subStr;

    }
}

執行結果如下:

技術分享圖片

Java中utf-8格式字符串的存儲方法。