字符集的一些疑惑

标准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码)
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 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"); 

发表评论

相关文章