标准ASCII字符集
计算机由美国人发明,所以要存储英文字母,数字,标点符号,于是进行编号,产生ASCII
字符集,0-127,使用1个字节
存储
GBK
但是中文有很多,于是产生了GBK(汉字编码字符集),包含2W多个汉字等字符,GBK中一个中文字符编码用两个字节
存储
注:GBK兼容了ASCII字符集
我a你 表示为 xxxxxxxx xxxxxxxx 0xxxxxxx xxxxxxx xxxxxxxxx ,计算机如何识别
GBK规定:汉字的第一个字节必须为1,来进行区别
Unicode字符集
一个国家有一个字符集的话,传输会有问题
国际组织制定了统一码:下面的两种方案
UTF-32
:4个字节标识一个字符,太过浪费,且效率变低
UTF-8
:可变长编码方案,共分为四个长度区:1个字节,2个字节,3个字节,4个字节
英文字符,数字等占一个字节
(兼容ASCII编码),汉字字符占用3个字节
a我m 0xxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 0xxxxxxx 如何识别
a 97 01100001
我 25105 110 001000 010001
m 109 01101101
解决方案:
0xxxxxxx (ASCII码)
110
xxxxx 10xxxxxx
1110
xxxx 10xxxxxx 10xxxxxx
11110
xxx 10xxxxxx 10xxxxxx 10xxxxxx
总结
字符编码时所使用的字符集,和解码时使用的字符集必须一致,否则会乱码
英文,数字一般不会乱码,因为很多字符集都兼容ASCII编码
使用Java程序对字符进行编码,解码
编码
String提供如下方法 | 说明 |
---|---|
byte[] getBytes() | 使用平台默认字符集将String编码为字节,结果存储到新的字节数组中 |
byte[] getBytes(String charsetName) | 使用指定的字符集将String编码为字节,结果存储到新的字节数组中 |
//默认字符集
String data = “a我m”;
byte[] bytes2 =data.getBytes();
System.out.println(Arrays.toString(bytes));
//指定字符集
String data = “a我m”;
byte[] bytes2 =data.getBytes(“GBK”);
System.out.println(Arrays.toString(bytes));
解码
String提供如下方法 | 说明 |
---|---|
string(byte[] bytes) | 使用平台默认的字符集解码指定的字节数组来构造String |
string(byte[] bytes, String charsetName) | 使用指定的字符集解码指定的字节数组来构造String |
//默认字符集
string s1 = new String(bytes);
//指定字符集
string s1 = new String(bytes,"GBK");
标签:疑惑,字节,bytes,字符集,GBK,一些,ASCII,String
From: https://www.cnblogs.com/gk0d/p/16890478.html