DEV Community

YuDi
YuDi

Posted on

了解一下字符的编码和集合

今天我们来了解一下字符的编码与集合。我们在日常的电脑或是手机使用过程中会遇到“乱码”的问题。比如你用电脑写了一往篇文章,但用手机看的时候就看不懂了。成为了“乱码”。而实际上并不是你写的文章成为了乱码。而是你写的文章在保存的时候用的编码与你显示的时候用的设备的编码不一致。这样就会出现了显示成“乱码”的情况。
而我今天要说的就是这个问题。首先说一下题目的意思。在现在用的电子设备中,显示的都是这种可见的字符。所有的电子产品都一样无一例外。而显示的这种字符在电子设备中都要以二进制的形式来进行。因为我们众所周知的电子产品只认识一种东西都就是二进制。那么我们就需要用一种方法把这种字符用二进制给表示出来,然后用二进制给保存起来。当我们想要用它的时候再从保存的地方给取出来,当然这个时候取出来的也是二进制,再把这些二进制数据按照保存时的字符的编码给翻译成需要显示的字符然后再显示出来。在这个过程中,我刚才提到了字符的编码。还有一个就是字符的集合简称字符集。
本人所知道的最古老的字符集就是ASCII字符集。一共有127个字符。当然其中既有可见字符也有一些是不可见字符。其中就包括0-9的数字,A-Z的大写和小写字母。当然也有一些西文符号。实际上我们现在用的电脑键盘就是一个ASCII字符集的最好表现。
上面啰里啰唆的写了那么多,连最基本的概念都没写清楚。那就是对于字符来说,有字符集和字符编码的两个概念。对于最早的时候是没有这种区分的。比如在上世纪的时候几乎是没有分别的,主要也就是几个因素决定的,其中最主要的原因就是最早的存储器价格太过于昂贵本人最早在上世经90年代的时候接触的电脑内存只有1M就算是硬盘也不过40M的电脑,采用的DOS操作系统。在这种级别的机器上不可能用于保存一个字符就采用4个字节。那个时候就只有ASCII这种字符编码。写到这里又要多说一句本人对ASCII有非常敬佩之情,虽然本人的英文水平非常的低。说实话在这个网站写文章本来应该是用英文的,但本人的英文真的是不行。用英文根本写不出一个像样的文章。也表达不出来我本人的情感于是最后还是决定我的文章都用中文来书写。
在本人的认知范围内只有ASCII既是字符集又是字符编码。虽然说既是字符集又是编码的还有GBK、GB2312、Big5等。但其它的真的是不值一提,本人觉得都只是过渡的东西。根本就算不上一个成熟的字符集或是编码。
自从电子产品的字符集开始国际化的时候字符集和编码也就开始出现了不一致的问题。开始的时候就是ASCII既是字符集又是编码。后来随着电子产品在世界的流行,就出现了非英文的国家也要使用电子产品。然而这个时候的电子产品仅支持英文,所以非英文国家就想办法对电子产品开始了本国化的改造。就拿中国大陆来说,就是对电子产品的简体中文化,所以就出台了最开始的一级字库和二级字库我本人的记忆中一级字库是3千多个汉字,二级字库也是3千多个汉字加在一起就是6千多个汉字。这时的电子产品最小的还是桌面化的电脑而当时要解决的也就是几个问题。第一个就是汉字的编码问题,也就是字符集的存储。这时就把这6千多个汉字用了两个字节给存储起来。这个就是GB2312简体中文字库了,一共6千多个汉字。后来又觉得6千多个汉字还是有些少了于是就又加了一部分就是后来的GBK简体中文字库。也是采用了两个字节来存储。用两个字节存储的意思就是采用两个字节将GB2312或是GBK字符集的汉字所在的位置给存储起来。然后就是要解决第二个问题,那就是汉字的显示问题。因为就算是你把汉字给存储起来了但显示的时候只能显示英文那么看到的还只能是“乱码”根本不知道存储前到底写的文本是什么。所以就要解决汉字的显示问题。当然最后还有一个就是汉字的输入问题。也就是现在用的“输入法”。在解决了这三个问题之后当时的电子产品就可以用GB2312或者是GBK字符集了。到现在ASNI采用的也是这种,也就是到现在为止的Windows采用的默认字符集。至于ASNI我们稍候会详细的讨论。
下面我说一下字符集(英文:Character Set)与字符编码(Character Encoding)的区别。实际上上面说了半天早就应该说这个问题了。或许这个问题应该放在最前面写的。在早期的时候,比如我上面写的DOS时代是没有这么详细的差别的。只是后来电子产品的国际化才出现了这两个概念的不同。字符集是纯纯的一种字符的集合。在字符集里面只是规定了有多少个字符,每一个字符对应的位置而已。而字符的编码才是在电子产品中真正起到作用的东西。只不过这两个概念有好多交叉的地方,而且这两个概念也很相近,甚至有很多都搞计算机编程多年的人都搞不清楚这两个概念的差别。
常用的字符集和字符编码:
一、常见的字符集:
ASCII:个人认为是最常见的最经典的字符集,同时也是编码。可以说是唯一个既是字符集又是字符编码的经典也是其它字符集和字符编码的基础。
GB2312:是比较早期的简体中文字符集。这种字符集后来采用的是两个字节的编码来存储。
GBK:是一个比较经典的简体中文的字符集。这种字符集是GB2312的一个扩展,完全包括GB2312,也是采用了两个字节的编码来存储。也是至今为止Windows操作系统用于保存简体中文的默认字符集。
Big5:这个字符集是繁体中文的字符集,也是采用了两个字节来存储。由于本人只懂中文所以只能写出来中文的各种字符集或是编码。其它文字的本人也不了解。
ASNI:这个字符集是一种变化的字符集,在存储英文的时候会采用ASCII;在存储简体中文的时候会采用GBK;在存储繁体中文的时候会采用Big5;在存储日文的时候会采用另一个字符储,在存储韩文的时候还会用一种韩文的编码。一般来说都是采用两个字节来存储除英文以外文字。也就是说如果采用这个字符集的话那么在不同文字的电子设备上面会显示出不同的文字。为文字的显示或是相互之间的翻译带来了诸多的不便。上面写到Windows简体中文默认的是采用GBK字符集,而实际上Windows采用的就是这种字符集。也就是说如果你在Windows操作系统中用记事本写了一段话,如果你是在简体中文版里面写的。那保存之后你到了日文版中,那么你看到的很有可能并不是“乱码”而是另一段驴唇不对马嘴的话。这个就是这种字符集让人无语之处。
USC-2:这个是一个早期的国际化的字符集。一共有65536个符号正好是两个字节可以存储的下来。开始的时候就是打算采用这种字符集就做为国际化的最终字符集,但这个国际化不可能只满足这么几个符号。所以,这种字符集出现的时间不长就被USC-4给取代了所以采用固定两个字节长度的编码方式也就很少有人在用了。但对这个字符集进行了支持的也就只有Windows操作系统和微软公司生产的部分软件,如SQLServer数据库。
USC-4:这个字符集应该是现在世界上采用最多的字符集。到目前为止也是一直在扩展。也正是这个字符集的出现才真正的区分了字符集和字符编码的问题。这个字符集几乎包括了世界上所有文字符号。其信息量也是非常的大。
二、常见的字符编码:
ASCII:无论是字符集还是字符编码第一个要说的都是这个ASCII。绝对到目前为止最为经典的字符编码。就是由于其之前使用的量太大导制后面的编码都必需要考虑跟这个编码的兼容性问题。如果与这个编码的兼容性不好的话可能就要面临被淘汰。
UTF-16:这种编码方式主要是用来存储USC-2字符集的,所以开始的时候这种编码就是采用的固定两个字节的长度进行字符的存储。可是后来USC-4出现之后这种编码又提出了如果超USC-2的符号就自动采用四个字节来存储。所以,这个就是一个“鸡肋”形的编码方式了。一般来说已经很少采用了,不过到现在Windows中的C#程序和SQLSERVER数据库的默认字符串的编码还都是采用了这种编码方式。如果想用其它的编码字符串就要显式的在程序中进行修改。而这种编码方式对ASCII编码的兼容方式就是前127个字符就是ASCII编码而前面的那个字节就全为零。
UTF-32:这种编码方式是一种用来存储USC-4字符集的编码方式。采用固定的四字节存储方式。这种编码总的来说如果保存的东西主要是英文即ASCII编码中的字符的话那么就会浪费非常的大,就是存储一个明明只用一个字节就可以的东西就需要四个字节。这样存储空间会有很大的浪费。比如在写HTML的程序的时候那些HTML的标签。全部都会是ASCII中的字符如果采用UTF-32来存储的话那就会膨胀四倍。所以,这种编码方式普遍也是不受欢迎。
UTF-8:这种编码方式是目前采用的比较多的编码方式。采用了变长存储采用一个字节至六个字节的存储方式,可以用来存储USC-4字符集中的所有字符。采用这种字符编码后所存储的内容不论在哪里都会是同一个字符。这种字符的编码方式也把各种语言之间的翻译有了比较简单的方式。也是目前的Unix系列的操作系统采用的国际化的字符编码方式。之前看到过一个文章写的就是在网页上面列出来的文件列表,但点击下载后就说找不到这个文件。其原因就是现在的网页上显示用的一般都是UTF-8编码。而Windows操作系统中保存文件如果是除英文以外的文件名称的话,就会用了不同的编码,所以在查找文件的时候就无法找到。这个时候就要把文件名给转换一个字符编码。转换的时候还要看保存这个文件的操作系统是什么。如果是Windows系列的那就要用ASNI,如果是Uni系列的操作系统的话就可以直接用网页传过来的名字去访问文件了。现在的市面上的主要数据库大多数也都是采用UTF-8来存储国际化的文字符号。

Top comments (0)