字符集xxx

文章目录

  • 总览
  • GBK2312
  • GBK 编码
  • unicode编码
  • 汉字转UTF-8


总览

unicode是字符集,utf-8是编码规则
其他的字符集,比如ASCII,GB2312,GBK,编码规则都直接使用字符对应的码位

字符集合有 :ASCII 、GBK2312 、GBK 、GBK18030、unicode
最初始ASCII,然后最多128位,也就7位。
但是存不下汉字啊。
然后汉字出现了新的字符集 GBK2312,而GBK存的更多而已,GBK18030是也包含了少数民族的。他们都是向下兼容的(比如GBK2312就可以表示ASCII码了)。最后ISO组织为了统一,推出了UNICODE编码


GBK2312

GBK2312是分区管理的,分了94区,每个区94个汉字。
比如侃,它的码位就是5789(57是分区,8 和9是分区里面的位置)。那码位如何存在计算机里面呢?
将57和89转为16进制,分别加上0XA0,得到0xD9 和 0XA9就可以了,最终就是D9A9了,二进制就是1101100110101001,一共16位,占两个字节。
(1 KB = 1024B =1024Bite= 1024字节=1024*8位)
为什么加上0XA0,是因为有个规范ECMA-35
ECMA-35已经被采纳为ISO 2022标准,GB2312 就是遵循这个标准来制定的。对于 ASCII 码,大家应该都很熟悉,ASCII 码是7位编码,0x00-0x1F (0-31) 是控制字符,0x20-0x7F (32-127) 是图形字符。基于 ASCII 码的标准,ISO 2022 制定了8位的标准:1. 0x00 - 0x1f(0-31) 保留给 C0 控制块2. 0x20 - 0x7f(32-127) 保留给 G0 图形块(包括空格和 DEL)3. 0x80 - 0x9f(128-159) 分配给 C1 控制块4. 0xa0 - 0xff(160-255) 分配给 G1、G2 和 G3 图形块,用转义序列切换GB2312 是双字节编码,为了与 ASCII 码区分开,字节的第8位必须是1,所以GB2312是8位编码。所以至少要从 0x80(128, 1000 0000) 开始吧,但是根据上面的规定,0x80 - 0x9f 要留给控制块,所以只能从 0xA0 开始咯。那为什么 GB2312 编码不是从 0xA0 开始,而是 0xA1 开始呢? 因为 0xA0 正好是图形块的空格,所以就从 0xA1 编码,这就是 0xA0 的由来。
(来自https://www.zhihu.com/question/21918229/answer/246782037)

GBK 编码

为了再多一点汉字,有了GBK编码集。
它不在两个16进制位都大于127了(因为加了A0就是160以上了),只需要最高位大于127用于与ASCII码区分就可以了。

unicode编码

后面发现,中国有自己的字符集,那我日本、哈萨克斯坦…是不是也有自己的字符集呢?
为了统一,ISO提出了Unicode编码集。

为了统一,就使用了utf-8编码规则。

汉字转UTF-8

// 哈的unicode码元:54c8,二进制是 0101 0100 1100 1000
// 啊的unicode码元554a,二进制是 0101 0101 0100 1010
// 按照UTF-8的模板
// 1110xxxx 10xxxxxx 10xxxxxx
// 哈转换为11100101 10010011 10001000,16进制就是E59388
// 啊抓换为11100101 10010101 10001010,16进制就是E5958A
String aa = new String(“哈啊”);
System.out.println(URLEncoder.encode(aa, “UTF-8”));字符集xxx_第1张图片

你可能感兴趣的:(实战,字符集)