字符编码方法概述

1. ASCII码

  • 由于计算机是美国发明的,因此,最早只有127个字符被编码到计算机,也就是大小写英文字母、数字和些符号,这个编码表被称为 ASCII 编码,A 的编码是 65 ,z 的编码是 122 。后128个称为扩展ASCII码。
  • 由于这些字符串长短不一,写在一起让我们难以分清字符的起始位置,所以就这255个字符,那最长的也不过是111111111B位,我们就把所有的10进制都转换成8位的2进制。

2.GB2312 & GBK

英文问题是解决了, 我们中文如何显示呢?我们1980年设计出了GB2312编码表,如下,共存了6763个汉字。
在这里插入图片描述

  • 这个表格很大,像上面的字区域有72个,这导致通过1个字节是没办法表示1个汉字的(因为1个字节最多允许256个字符变种,现在6千多个,只能2个字节啦, 2**16=65535个变种)。
  • 但是还有中英文混杂的情况,这就要求你必须在gb2312同时支持中英文,但是还不能是2个字节表示1个英文字母(原本1字节就行),不然存储容量直接翻倍。
  • 因此,做如下判断:如果2个字节连在一起,且每个字节的第1位(也就是相当于128的那个2进制位)如果是1,就代表这是个中文,这个MSB位是128的字节被称为高字节。 也就是2个高字节连在一起,必然就是中文。(因为0-127已经表示了绝大部分字符, 128-255是ASCII的扩展表,表示的都是极特殊的字符一般用不到,中国就直接拿来用了)
  • 1995年, 升级了gb2312,即GBK。 加更多字符,包括藏语、维吾尔语、韩语、蒙古语什么的统统都包含进去了, 这个编码叫GBK,直到现在,我们的windows电脑中的编码就是GBK.

3. Unicode

  • 上百个国家都搞自己的编码标准,那边我们使用国外引入的一些东西的时候就会出现乱码。因此Unicode出现。 将所有语言统一到该编码标准,这样就不会再有乱码问题了。Unicode 以2-4字节的编码方式 已经收录136690个字符,并还在不断扩张中…
  • 最常两个字节表示1个字符(常偏僻的字符,就需要4个字节)。现代操作系统和多数编程语言都支持Unicode。
  • 除此之外,Unicode还便于和其他编码标准转换。
  • 缺点在于,若是用Unicode编码,那存储纯英文的文本内存直接翻倍。于是有了UTF(Unicode Transformation Format)。

4. UTF

  • UTF-8: 1、 2、 3、 4个字节表示所有字符;优先1个字节、否则2个字节,最多4个字节。英占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个。
  • UTF-16: 2、 4个字节表示所有字符;优先使2个字节,否则4个字节表示。
  • UTF-32: 4个字节表示所有字符。
    总结: UTF 是为unicode编码设计的在存储和传输时节省空间的编码方式。

ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续用。

5.几种方式的总结

在这里插入图片描述

  • 在计算机内存中,统一用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
  • 记事本编辑的时候,读取的UTF-8字符被转换为Unicode字符到内存,编辑完成后,保存的时候再把Unicode转换为UTF-8保存。
    在这里插入图片描述

6. 不同字符编码方式的转换

  • mac/linux是UTF8编码,Windows中国是GBK。因此Windows上的文本转到Mac上会出现乱码。
  • 方案一:转Unicode
  • 方案二:转UTF-8
  • py2默认以ASCII进行文件编码,py3默认以UTF-8进行文件编码,py23在内存中以Unicode编码。但是py3会自动进行解码操作将GBK格式转换为Unicode,py2不会,必须手动使用decode方法去解码才能正常print。
  • 任何编码转成Unicode称为解码(decode),Unicode转换成其他的为编码(encode)。
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43445577/article/details/115368108