天天看点

编码问题的故事(ANSI、ASCII、Unicode,UTF8和UTF16)ASCII时代ANSI时代(顺带给讲一下什么是半角字符,什么是全角字符,细心地小伙伴们应该在输入法中看过这个东西吧)Unicode时代UTF8和UTF16的实现方式

我是来讲故事的,重复,我是来讲故事的ԾoԾ ,hhh

  • ASCII时代
  • ANSI时代(顺带给讲一下什么是半角字符,什么是全角字符,细心地小伙伴们应该在输入法中看过这个东西吧)
  • Unicode时代
  • UTF8和UTF16的实现方式

ASCII时代

  • 话说在long long ago,计算机被人们发明了出来,这个时候大家说要让计算机显示文字和一些符号,可是计算机本身只有二进制来存储数据(我指的是冯·诺依曼架构计算机),那怎么办呢?
  • 于是就有了我们伟大的ASCII码表的诞生。ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)使用7位(bit)来表示一个字符,总共能够表示128种字符。注意,第一位是不用的。
    编码问题的故事(ANSI、ASCII、Unicode,UTF8和UTF16)ASCII时代ANSI时代(顺带给讲一下什么是半角字符,什么是全角字符,细心地小伙伴们应该在输入法中看过这个东西吧)Unicode时代UTF8和UTF16的实现方式
  • BUT,因为ASCII码看名字就知道是人家老美做出来的东西,人家才不会把其他国家的什么文字往他们创造出来的表里面放呢。可是虽然老美们阻止了新的文字进入ASCII码表,可是他们阻挡不了计算机的传播。很快计算机传遍了欧洲,打个比方,人家法国人想把自己的那什么奇奇怪怪的字母往电脑里面放怎么办呢?
    编码问题的故事(ANSI、ASCII、Unicode,UTF8和UTF16)ASCII时代ANSI时代(顺带给讲一下什么是半角字符,什么是全角字符,细心地小伙伴们应该在输入法中看过这个东西吧)Unicode时代UTF8和UTF16的实现方式
  • 于是他们的眼睛就盯上了上面说到的那一位闲置不用的第一个bit。于是后来就有了IBM对原本的ASCII码进行了扩充,使用8位来表示一个字符,新增了128种字符,这也仅仅是对一些拉丁字母和特殊符号的扩充(注意:为了不误导大家我注明一下,IBM其实是美国的公司,不是法国)
    编码问题的故事(ANSI、ASCII、Unicode,UTF8和UTF16)ASCII时代ANSI时代(顺带给讲一下什么是半角字符,什么是全角字符,细心地小伙伴们应该在输入法中看过这个东西吧)Unicode时代UTF8和UTF16的实现方式

ANSI时代(顺带给讲一下什么是半角字符,什么是全角字符,细心地小伙伴们应该在输入法中看过这个东西吧)

  • 好,可能有的小伙伴在上面就会继续问了。那计算机要是到了亚洲呢?那怎么办??咱们中文可不止26个英文字母,光是我爸放在家里那本《辞海》上面就有快两万个单字(我可没数,百度的)这还只是中国,还有日本,韩国……,这个八位的ASCII编码来放我们的文字肯定不够,八位最多就放28 = 256个单字。
  • 怎么办呢?于是那个时代一个国家想要普及计算机最首要要做的事情就是开发一套自己国家语言的编码。
  • 我国在那个年代就提出一套GB2312编码方式,这套编码基于ASCII码(并非IBM的ASCII扩充版本),使用2个字节(也就是16位)表示一个汉字。具体的方式是前127个字符不变,当第一个字节(高字节)大于160的时候,表示一个汉字的开始,再用这个字节组合第二个字节(低字节,范围也是160-255)共同表示一个汉字。这套编码不仅把中文编码进去,还把一些数学符号、罗马希腊字母和日本假名等等都编码进去,并且还把ASCII中原有的26个英文字母和符号都编入,当然这些字母是以2个字节表示(注意:这个时候在这个编码里面就有了两套字母和一些符号),为和ASCII中原有的字母区别表示,称前者为“全角字符”,后者为“半角字符”(哈哈哈,现在明白了嘛)。
    编码问题的故事(ANSI、ASCII、Unicode,UTF8和UTF16)ASCII时代ANSI时代(顺带给讲一下什么是半角字符,什么是全角字符,细心地小伙伴们应该在输入法中看过这个东西吧)Unicode时代UTF8和UTF16的实现方式
  • 当然我大中华文化底蕴深厚,我说过我爸那本词典上就有两万个字,所以GB2312也只能编入部分常用汉字,为了把更多的汉字编入进来,就创造出了GBK标准。GBK只要求当高字节大于127时就表示汉字的开始,低字节也不再要求范围。
  • 类似我国的编码方案,其他地区和国家也制定了自己的编码方案,如日本的Shift_JIS等等。这些编码方案称为 “DBCS”(Double Byte Charecter Set 双字节字符集)"即是用双字节表示一个字符,也称为ANSI。这里的ANSI代表了不同国家的不同编码方案,如果一台Windows操作系统设定为中文,那么ANSI就表示GBK,如果设定为日本ANSI就表示Shift_JIS。
    编码问题的故事(ANSI、ASCII、Unicode,UTF8和UTF16)ASCII时代ANSI时代(顺带给讲一下什么是半角字符,什么是全角字符,细心地小伙伴们应该在输入法中看过这个东西吧)Unicode时代UTF8和UTF16的实现方式
  • 然而问题又来了:
  • (1)假如,打个比方,像是现在唱rap的,不会几个什么freestyle、hold on、diss、check it out、skr(我不是针对他……)都混不下去,那么如果要统计一段rap歌词中有多少字符可咋办呐?又有中文又有英文,如果这个人语言比较多加上日语什么的就更麻烦了。
  • (2)上面那个还不算是麻烦的,统计而已,假如是数据传输呢?假如吴亦凡在韩国唱rap,收到大陆传给他的一封信,一打开全是乱码,因为你是按照韩国的编码打开的中文文档,当然会乱码,这大大的影响了我吴亦凡唱rap的心情,罪孽深重!改!赶紧改进去!
    编码问题的故事(ANSI、ASCII、Unicode,UTF8和UTF16)ASCII时代ANSI时代(顺带给讲一下什么是半角字符,什么是全角字符,细心地小伙伴们应该在输入法中看过这个东西吧)Unicode时代UTF8和UTF16的实现方式

Unicode时代

  • 为了世界的和平,为了爱和正义,武藏小次郎,哦,不,是ISO(国际标准化组织)制定了一种新的编码规范,将全世界的文字放在一张表内,称它为"Universal Multiple-Octet Coded Character Set",简称 UCS, 俗称"UNICODE"。严格说Unicode只是一套标准,为全世界文字给予一个唯一的编码,但是并没有规定在计算机中如果存储。
    编码问题的故事(ANSI、ASCII、Unicode,UTF8和UTF16)ASCII时代ANSI时代(顺带给讲一下什么是半角字符,什么是全角字符,细心地小伙伴们应该在输入法中看过这个东西吧)Unicode时代UTF8和UTF16的实现方式
  • 根据Unicode标准来制定具体的实施方案就是UTF-8,UTF16以及UTF32,它们用来规定了如何在计算机中存储、表示。
  • UTF-16,对于Unicode标准中的文字,使用2个字节(16位)或4个字节来存储其编号。为什么是2个或4个字节表示呢?因为如果要包含全世界所有的符号文字,即使使用2个字节都无法包含,想想GBK编码,占满了2个字节仅仅包含我们大中华文字部分文字。但是针对各国的常用文字在2个字节内都能包含,所以通常使用2个字节的UTF16就足够了。所以在使用UTF16编码的文章或文档里,统计字符个数无需像ANSI那样麻烦,而且同一篇文章在各国的Windows等操作系统中使用UTF8打开不会造成乱码问题,十分方便。
  • UTF8,对于欧美的一些国家,常用的还是英文字母,如果使用UTF16,白白浪费一倍的存储空间(因为他们只需前128的字符就足够了)。针对此,UTF8产生了,它是一种变长编码方式,使用8位来实现Unicode中的所有字符

UTF8和UTF16的实现方式

哈哈哈,我都说了这篇文章是讲故事来的,我才不跟你讲具体实现呢,有时间再补上。嗯,就到这里啦~

编码问题的故事(ANSI、ASCII、Unicode,UTF8和UTF16)ASCII时代ANSI时代(顺带给讲一下什么是半角字符,什么是全角字符,细心地小伙伴们应该在输入法中看过这个东西吧)Unicode时代UTF8和UTF16的实现方式

嘿嘿,I am very glateful that 你看到这里了哦~下回再见ヾ(o◕∀◕)ノヾ

Thx

编码问题的故事(ANSI、ASCII、Unicode,UTF8和UTF16)ASCII时代ANSI时代(顺带给讲一下什么是半角字符,什么是全角字符,细心地小伙伴们应该在输入法中看过这个东西吧)Unicode时代UTF8和UTF16的实现方式

继续阅读