字符集编码—ASCII/ISO-8859-1/GBK/unicode/UTF-8

字符集编码—ASCII/ISO-8859-1/GBK/unicode/UTF-8

为什么要编码?

答:要表示的符号太多,没有统一的标准,计算机无法识别没有标准的字符

定长编码便于计算机处理,GBK不是定长编码,unicode属于定长编码

ASCII—美国信息交换标准代码

用一个字节的低 7 位表示,最早出现的字符集,美国标准,2的七次方的字符,共128种

问题:无法包含其他国家的字符

ISO-8859-1

一个字节(8bit 1byte),2的八次方,共256种,相比于ASCII多了一倍字符集,包括拉丁字和西欧语

问题:依然无法包含所有其他国家的字符,中文

GBK

两个字节表示一个汉字,中国汉字专属编码格式 例:A5 B6

GB2312/GBK/GB18030

  • gb2312只能表示简体字
  • gbk编码能够用来同时表示繁体字和简体字,兼容gb2312
  • gb18030包含所有的中文文字

问题:无法让全世界编码规范统一,每个国家的字符集都不一样

unicode

为了解决全世界编码规范不同的问题,出现了unicode编码规范,它实现的编码方式可表示全世界所有的字符集,定长双字节,是一种根本标准,具体使用是使用它的实现

Unicode 编码字符集旨在收集全球所有的字符,为每个字符分配唯一的字符编号即代码点(Code Point),从 U+0000 到 U+FFFF被划分为17个平面,现在包括1114111个编码点

Code Point: 码点,简单理解就是字符的数字表示。

Unicode 当然是一本很厚的字典,记录着世界上所有字符对应的一个数字。具体是怎样的对应关系,又或者说是如何进行划分的,就不是我们考虑的问题了,我们只用知道 Unicode 给所有的字符指定了一个数字用来表示该字符。

\u597d->

问题:原来一个字节可以表示的字符现在需要两个字节了

UTF-8

unicode translation format-8,属于unicode的一种实现,使用unicode标准

为了解决unicode原来一个字节可以表示的字符现在需要两个字节的问题,出现了相对应的utf-8,utf-16,utf-32

UTF-8是一种可变长编码,可以使用1-4个字节表示一个字符,完全兼容ASCII

  1. 对于单个字节的字符,第一位设为 0,后面的 7 位对应这个字符的 Unicode 码点。因此,对于英文中的 0 - 127 号字符,与 ASCII 码完全相同。这意味着 ASCII 码那个年代的文档用 UTF-8 编码打开完全没有问题。
  2. 对于需要使用 N 个字节来表示的字符(N > 1),第一个字节的前 N 位都设为 1,第 N + 1 位设为0,剩余的 N - 1 个字节的前两位都设位 10,剩下的二进制位则使用这个字符的 Unicode 码点来填充
Unicode 十六进制码点范围 UTF-8 二进制
0000 0000 - 0000 007F 0xxxxxxx
0000 0080 - 0000 07FF 110xxxxx 10xxxxxx
0000 0800 - 0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000 - 0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

由此可以根据编码表区别这个字符是1个字节还是n个字节

参考博客:

https://www.ibm.com/developerworks/cn/java/unicode-programming-language/index.html

  • 本文作者: dzou | 微信:17856530567
  • 本文链接: http://www.dzou.top/post/charsets.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
  • 并保留本声明和上方二维码。感谢您的阅读和支持!