GBK、Unicode、utf-8 字符理解

89 阅读1分钟

Unicode:万国码,规定了所有国家的文字对应的字符编码。存在多个字节表示一个字符。

ASCII:一个字节存储文字,早期只能满足美国需求,全世界那么多文字不能满足。首位为0,只能存储128个字符。

GBK:可表示两万多个汉字字符集,一个汉字由两个字节存储形式表示。GBK兼容了ASCII字符集,但是汉字在首位存储必须是1。

UTF-8:Unicode码的一套编码方案,采取可变长编码方案。

image.png

通过前面几位即可区分字符所占位数。0:开头为一个字节(表示ASCII),依次递增。

image.png

英文字符集一般不会乱码,常见字符集都兼容了ASCII码。

案例:

String a = "a我b";
byte[] bytes = a.getBytes();
System.out.println(Arrays.toString(bytes));  //[97, -26, -120, -111, 98] 默认使用utf-8编码 所占字节5位(字母各占一位,汉字占3位),首位为1代表负数


byte[] gbks = a.getBytes("GBK");
System.out.println(Arrays.toString(gbks));  //[97, -50, -46, 98] 指定gbk后 共占4个字节(字母各占一位,汉字占2位)

String s = new String(bytes,"GBK"); //a鎴慴 utf-8编码的,用GBK解码就会出现乱码
System.out.println(s);