计算机中的编码问题

目录

一. 计算机编码

二. 计算机编码分类

1. ASCII编码

2. GBK编码

3. UTF-8编码

三. 计算机系统中的编码应用

四. 编码问题


 写代码的时候经常会碰到编码问题,一直以来对这个编码不是太了解,今天就来学下一下。

  • gbk编码: 中文占用两个字节,英文占用一个字节。
  • utf-8编码:中文占用三个字节,英文占用一个字节。

一. 计算机编码

       计算机编码指电脑内部代表字母或数字的一种记录数据的方式。

       为什么会出现编码?我们知道,计算机中的数据是由电子原件存储的,而因为工业技术  的限制,电子元件只能记录两种稳定状态“开”和“关”,用数字来表示,就是0 和1。也就是说,本质上计算机只能记录0和1这两个数字。每个0  或者1,我们称之为一个bit,是计算机最小的单位。这种只有0和  1的数字,我们称之为2进制数字。

       但很明显,我们需要记录的东西很多,所以只有两个数字肯定不行,于是3个bit共同来表示一位数字,就有了8进制。4个  bit共同来表示一位数字,就有了16  进制

       数字问题解决了,但是,如果想在计算机中存储一个字符‘a’,却无法做到。为了解决这个问题,人们就想了一种解决方法:把所有的常用的字符都统一编号,如‘a’的编号就是97,这样,当我们需要存储‘a’的时候,不直接存储‘a’,而是存储数字97,当拿出来的时候,再把这个97变成‘a ’,这样就完美解决了这个问题。

       而我们通常所说的“编码”就是这些字符的编号。所有字符的和其编号对应的表格,我们称之为“编码表”。

       常见的编码表:ASCII编码,GB2312编码(简体中文),GBK,BlG5编码(繁体中文),utf-8编码等

二. 计算机编码分类

1. ASCII编码

       计算机在创建之初,流行于“西方世界”或者叫“英语国家”,拆开来看,西方世界的语言、文字等等,充其量也就是26个英文字母加上一些符号,即使英文字母分大小写,也绝不超过128个,每个字符使用一个字节来表示,足够了。使用一个字节来表示一个字符的这种编码方式,就是最早的:ASCII编码。 

2. GBK编码

       后来,随着计算机的普及,整个世界都需要使用计算机来存储数据,如果还使用ASCII编码肯定不行(无法存储罗马字母表以外的字符),而且ASCII编码所规定的一个字节表示一个字符的这种规定很明显无法适用于整个世界(汉字至少也要几千个吧)。所以,各国都对ASCII编码进行了扩充,由原来的一个字节表示一个字符,转换为多个字节表示一个字符。 
例如GB系列编码是我国的国标编码,用来存储汉字,分为GB2312,GBK,GB18030,基本都能向前兼容,其中GBK是目前最通用的。

3. UTF-8编码

       当然,如果世界各国都使用自己的编码,那国家与国家之间的交流就比较麻烦,比如本来在你这里是赞扬的意思,到了对方那里,因为编码不同,解析出来是骂人的意思,这就不行了。所以,为了解决这个问题,由一个名为 Unicode 学术学会的组织,制订了一套编码规则-Unicode编码。该规则支持世界上超过650种语言。是一种世界通用字符规则。

       Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。不过他只规定了字符的编码,却没有规定字符以何种方式存储或者传输。所以UTF系列编码规定了Unicode编码的存储和传输方式。

      目前最常用的UTF编码分为3种,UTF-8,UTF-16和UTF-32,我们知道计算机是以8位为一个字节来存储数据的,而UTF-16,UTF-32分别用2字节和4字节来表示一个字符,所以这里就涉及到字节的存储顺序,是低位在前还是高位在前,这样,BOM就产生了。

BOM是文本文件开头的一个特殊标记,用一组特殊数字来标记文本文件的字节序。虽然UTF-8字节顺序是固定的,但为了兼容UTF-16和UTF-32也规定了UTF-8的BOM,用于标记UTF-8编码。不过UTF-8的BOM在不同平台的规定不同,要小心使用。

BOM规定如下

  • UTF-8 EF BB BF
  • UTF-16(LE) FF FE
  • UTF-16(BE) FE FF
  • UTF-32(LE) FF FE 00 00
  • UTF-32(BE) 00 00 FE FF

UTF-8编码:如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。所以,本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间:

三. 计算机系统中的编码应用

       在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码;用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:

浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:

所以你看到很多网页的源码上会有类似<meta charset="UTF-8" />的信息,表示该网页正是用的UTF-8编码

四. 编码问题

       所谓的“编码问题”,其实就是出现了中文乱码。为什么出现这种问题呢? 我们中国人,一般使用的都是中文的操作系统,而中文操作系统默认的编码格式是GBK。而国际上,为了全世界都能看懂,则一般使用UTF-8编码。(国际性网站一般都是UTF-8编码) 

  • GBK编码,一个汉字一般占用2个字节。 
  • UTF-8编码,一个汉字一般占用3个字节

    因为不同的编码方式中文占用的字节数不一样,所以一个编码方式用另外一个编码去进行解析就会出现乱码的问题。

其实,编码问题”的出现,无非是我们在解析别人给我们汉字的时候,使用的编码出错了,如果我们拿到的是GBK,就使用GBK解析,如果拿到的是UTF-8,就是使用UTF-8解析,这样不就解决了么?所以,如果是遇到字符串出现中文乱码:  

1.把中文乱码字符串重写打散,变为字节。

 2.使用xx构造函数重组字符串

       中文乱码只是因为我们在对字节解析的时候,组装错误了,就类似于玩积木的时候,放错位置了,但本质的字节没有改变。

参考:

1. 传智播客,https://wenku.baidu.com/view/eef190ca0129bd64783e0912a216147917117edd.html

2. https://www.jb51.net/article/119186.htm

猜你喜欢

转载自blog.csdn.net/qq_44159028/article/details/115201653
今日推荐