手机版

字符集和字符编码格式有什么区别和作用?

时间:2021-09-02 来源:互联网 编辑:宝哥软件园 浏览:

字符集和字符编码格式的区别和作用是什么?为什么代码在别人的电脑上运行时会出现乱码?事实上,主要问题在于存储在计算机存储介质中的二进制比特流。如果字符集和字符编码之间的转换规则不统一、不规范,就会乱码。

字符集和字符编码格式有什么区别和作用?

  字符集和字符编码格式有什么区别和作用?

在介绍字符集之前,我们先了解一下为什么会有字符集。我们在计算机屏幕上看到的是物化字符,而存储在计算机存储介质中的实际上是二进制比特流。那么两者之间的转换规则就需要一个统一的标准,否则如果我们把我们的u盘插到另一台电脑上,文档就会乱码;小伙伴QQ上传的文件,本地打开,乱码。

  什么是字符集?

在介绍字符集之前,我们先了解一下为什么会有字符集。我们在计算机屏幕上看到的是物化字符,而存储在计算机存储介质中的实际上是二进制比特流。那么两者之间的转换规则就需要一个统一的标准,否则我们把u盘插到老板的电脑里,文档就会乱码;小伙伴QQ上传的文件,本地打开,乱码。因此,为了实现转换标准,出现了各种字符集标准。简单来说,字符集指定了某个字符对应的二进制数字的存储方式(编码)以及用一串二进制数字表示哪个字符(解码)的转换关系。

那么为什么会有这么多的字符集标准呢?这个问题其实很容易回答。问问你自己,为什么我们的插头到了英国就不能用了。为什么显示器同时有DVI、VGA、HDMI和DP接口?许多规范和标准最初制定时并没有意识到它们将来会在世界上具有普遍性,或者它们出于自身的利益而希望在本质上不同于现有的标准。因此,有太多的标准具有相同的效果,但彼此不兼容。

说到这里,我们来看一个实际的例子。下面是各种代码下刁字的十六进制和二进制编码结果。你有没有刁的感觉?

字符集和字符编码格式有什么区别和作用?

  什么是字符编码?

字符集只是一个规则集的名称,对应现实生活,是某种语言的名称。例如:英语、汉语、日语。对于一个字符集来说,它需要三个关键要素来对一个字符进行正确的编码和转码:字符库、编码字符集和字符编码形式。字体表是一个相当于所有可读或可显示字符的数据库,字体表决定了整个字符集可以表示的所有字符的范围。编码字符集,即编码值代码点,用于表示字符在字体中的位置。字符编码将对字符集和实际存储值之间的转换关系进行编码。一般来说,码点的值直接存储为编码值。比如在ASCII中,A在表中排名第65位,编码后的A值为0100 0001,是十进制65的二进制转换结果。

看到这里,很多读者可能会有和我开头一样的疑问:字体表和编码字符集似乎是必不可少的,所以由于字体表中的每个字符都有自己的序号,直接用序号作为存储内容就好。为什么要费心通过字符编码将序列号转换成另一种存储格式?

原因其实很容易理解:统一字体表的目的是为了覆盖世界上所有的字符,但在实际使用过程中,会发现实际使用的字符比例与整个字体表相比非常低。比如说中文地区的程序几乎不需要日语字符,而一些英语国家甚至简单的ASCII字体表都可以满足基本需求。如果按照字体表中的序号存储每个字符,则每个字符需要3个字节(这里以Unicode字体为例),对于原本只使用ASCII编码一个字符的英语国家来说(存储量是原来的三倍),这显然是一个额外的成本。更直接的说,同一个硬盘可以存储1500篇ASCII格式的文章,但只有500篇3字节Unicode序列号的文章。因此,出现了UTF-8等变长编码。在UTF-8编码中,只需要一个字节的ASCII字符,但仍然只有一个字节被占用。像中文和日文这样的复杂字符需要2到3个字节来存储。

  UTF-8和Unicode的关系:

看完以上两个概念的解释,更容易解释UTF-8和Unicode的关系。Unicode是上面提到的编码字符集,UTF-8是字符编码,是Unicode正则字库的一种实现形式。随着互联网的发展,对同一字体集的要求越来越迫切,Unicode标准自然出现。它涵盖了不同国家语言中几乎所有可能的符号和字符,并将对它们进行编号。参见:维基百科上的Unicode。

Unicode数字从0000到10FFFF分为16个平面,每个平面有65536个字符。然而,UTF-8只实现了第一架飞机。可以看出,UTF-8是最被广泛接受的字符集编码,但它并没有覆盖整个Unicode字体,这也使得它在某些场景下很难处理特殊字符(后面会提到)。

  UTF-8编码简介:

为了更好的理解后期的实际应用,我们简单介绍一下UTF-8的编码实现方法。也就是UTF-8的物理存储和Unicode序列号之间的转换关系。

UTF-8编码是可变长度编码。最小代码单位是一个字节。一个字节的前1-3位是描述部分,后面是实际序列号部分。

如果字节的第一位为0,则表示当前字符是单字节字符,占用一个字节空间。0后的所有部分(7位)代表Unicode中的序列号。

如果一个字节以110开头,则意味着当前字符是双字节字符,占用2个字节的空间。110后的所有部分(7位)表示Unicode中的序列号。第二个字节以10开始

如果一个字节以1110开头,则意味着当前字符是三字节字符,占用2字节空间。110后的所有部分(7位)表示Unicode中的序列号。第二个和第三个字节以10开头。

如果一个字节以10开头,则意味着当前字节是多字节字符的第二个字节。10后的所有部分(6位)表示Unicode中的序列号。

每个字节的具体特征见下表,其中x代表序列号部分,每个字节中的所有x部分拼接在一起形成Unicode字体的序列号:

字符集和字符编码格式有什么区别和作用?

让我们看三个从一个字节到三个字节的UTF-8编码示例:

字符集和字符编码格式有什么区别和作用?

细心的读者很容易从上面的简要介绍中得出以下规律:

3字节的UTF-8十六进制编码必须以e开头。

2字节的UTF-8十六进制编码必须以c或D开头.

1字节的UTF-8十六进制编码必须以小于8的数字开头。

  为什么会出现乱码?

“先传播科学再混淆视听”的英国本土说法是mojibake。

简单来说,出现乱码字符是因为编码和解码使用了不同或不兼容的字符集。对应现实生活,就像英国人在纸上写“祝福”表示祝福。而一个法国人得到了这张纸,因为,在法语中,“保佑”的意思是“受伤”,所以他认为自己想表达“受伤”(解码过程)。这是现实生活中乱码的情况。在计算机科学中,用UTF-8编码的字符用GBK解码。由于两个字符集的字体表不同,同一汉字在两个字表中的位置也不同,最后会出现乱码。

让我们看一个例子:假设我们使用UTF-8编码来存储两个单词,将会有以下转换:

字符集和字符编码格式有什么区别和作用?

因此,我们得到了E5BE88E5B18C等一系列数值。显示时,我们使用GBK解码来显示。通过查阅表格,我们得到以下信息:

字符集和字符编码格式有什么区别和作用?

解码后,我们得到了错误的结果,更糟糕的是,字符数发生了变化。

  如何识别乱码的本来想要表达的文字?

要从乱码字符中破译出原本正确的字符,需要深刻掌握每个字符集的编码规则。不过,原理很简单。这里以GBK展示UTF-8时的乱码为例,说明逆解识别的具体过程。

1.编码

假设我们在页面上看到了诸如atlas和crucible这样的乱码,我们知道我们的浏览器目前使用的是GBK编码。然后,在第一步中,我们可以通过GBK将乱码编码成二进制表达式。当然,查表编码的效率很低,我们也可以直接通过MySQL客户端使用下面的SQL语句来做编码:

01 MySQL [localhost] {msandbox}选择hex (convert ('huanguobian '使用gbk));

02 -

03|十六进制(转换('郭桓'使用gbk)) |

04 -

05| E5BE88E5B18C |

06 -

集合中的071行(0.01秒)

复制代码

MySQL [localhost] {msandbox}选择hex (convert ('Huanguojiao '使用gbk));

-

|十六进制(转换('郭桓'使用gbk)) |

-

| E5BE88E5B18C |

-

1行一组(0.01秒)

版权声明:字符集和字符编码格式有什么区别和作用?是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。

相关文章推荐