字符串,在编程世界里,应该是最特殊的一个对象,运用最广泛的一个对象。曾经,我们对于gbk,utf-8,gb2312,ascll,unicode等等,也有过许多疑惑,和懵逼。现在从计算机的发展,来解释一下这些标准。
大家先预先理解两个概念:一个是编码格式,一个是存储格式。
ascll
计算机是谁发明的?
冯诺依曼。一个德国人。但是在美国,替美国人干活。所以搞出来的标准是美国的习惯。把0–9数字,和26个英文单词的大小写,及若干符号编排成127个。占7位,不到一个字节。
这边整,英国人,新西兰,加拿大,澳大利亚等英语国家,可能没啥问题,照用不误。但德国人,法国人,俄国人,日本人,意大利人,中国人不干了。
中文,大概五万多个,除了生僻的字外,基本两个字节可以搞定,于是搞了gb2312;出于同样的心理,日本人搞了Shift_JIS里,韩国人搞了Euc-kr里,各国有各国的标准。这样整个计算机世界就乱套了。中日文不同,中韩文不同,没法交流,很多乱码。
零几年的软件,N多乱码,几乎网络上留存无数解决中文乱码的问题。
必须要解决如何搞?那就搞一套统一的呗。
Unicode横空出世。
Unicode
Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
两个字节不行包含的,就四个字节。四个字节不能包含的,就8个字节。反正,总能把全世界的语言都包含进去。
好了,这样皆大欢喜,大家都能用自己的国家语言,没有乱码问题了。
随着而来的又出现了一个问题。美国人,英国人不干了。
都用unicode,两个字节表示一个字,我们就用了26个字母,ascll就搞定了,一个字节就搞定了。那我不浪费了很多空间。第二个字节全是0.
然后utf-8就出现了。
uft-8
“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:
小结
编码 | 大小 | 支持语言 |
---|---|---|
ASCII | 1个字节 | 英文 |
Unicode | 2个字节(生僻字4个) | 所有语言 |
UTF-8 | 1-6个字节,英文字母1个字节,汉字3个字节,生僻字4-6个字节 | 所有语言 |