新文章 网摘 文章 随笔 日记

Unicode与bytes有何区别?

作者:知乎用户
链接:https://www.zhihu.com/question/23875818/answer/44009971
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在很久很久以前(笑),也就是ASCII码时代,一个字符被编码为一个Byte,我们都知道一个Byte对应了8bit,所以可以表示2^8 = 256个不同的字符。而我们的ASCII码则是只使用了低7位bit来表示,一共2^7 = 128个字符。而事实上,就想下面这张表所表示的,ASCII码的0~31号也不表示任何可见字符,而是控制字符,比如/t, /a什么的。所以ASCII码一共就表示了128-32 = 96个字符,分别是数字,大小写字母和一些常见英文符号。ASCII码就是如此单纯而可爱。

 

但是人类的语言博大精深,永无止境的,特别是欧洲的小国家比如法国,西伯利亚,还有一些乱七八糟的字母。所以,大家开始利用这个1byte里面的128及以上的码号来表示一些特定的字母,因为标准不同,所以大家都没有规定128及以上的码号到底表示什么,IBM就搞了个OEM字符集:

你可以看到,IBM维持了ASCII码标准,但是添加了很多奇怪的西文符号和画图用的表格线等等。
但是IBM并不是唯一一家,很多不同国家的人开始肆无忌惮的利用多出来的这一个bit来表示自己国家的特定文字,这些不同的系统我们称之为不同的Code Page。其实如果只是在本地操作,都还好,但是互联网出现了,导致你用的这个Code Page,我用的那个Code Page,我们没有办法协调统一。而且最可恶的是,他们竟然忽略了亚洲,忽略了我博大精深的上千中国文字,怎么可以在短短一个Byte里面表示呢。

 

所以,Unicode应运而生了,事实上,Unicode把世界上所有国家的所有文字进行了映射,映射成了一个个叫做Code Point的代码点(大概有2^20多个)比如Hello,对应的就是U+0048 U+0065 U+006C U+006C U+006F。Unicode还把所有的文字分成了2^16次方一组,一共17组。而第一组0~2^16叫做Basic Multilingual Plane,BMP。根据2~8原理,大部分正常人会用到的字符都在这个区间里面。

因为代码点不是固定长度的,所以为了正确存储和表示这些代码点,我们想到了运用编码来解决这个问题。所以也就出现了我们常常听见的UTF-16,UTF-32,UTF-8。

首先介绍UCS-4,其实它就是用4byte来表示所有的Unicode,因为4byte其实就可以把所有的Plane给包含了。当然这个问题也很明显,就是占用了太多空间了。

然后介绍一下UCS-2,也就是用2byte来表示Unicode的BMP。大部分情况下够用,然后后来人们又用UTF-16取代了它。严格意义上UTF-16是变长的编码方式。只不过现在大家似乎都习惯的接受了UTF-16是用2byte来表示,和UCS-2混用了。

我们称前两种叫做WCS(Wide Character Set,宽字符集),但大部分情况下,提及WCS,我们指的是UTF-16。因为涉及到2个Bytes,所以,就要考虑在不同CPU上如何分辨Little Endian还是Big Endian,所以这两种表示法都需要BOM(Bye Order Mark)标志(也就是在文档开头存“FEFF”,这样程序读取的时候就可以知道是Little Endian或者Big Endian了)。

但是用WCS有一个问题,就是它存在内存空间的浪费,所以人们又发明了UTF-8这种编码方式。UTF-8中,0~127号字符都和ASCII码一样,用一个Byte存储,只有128号及以上,采用多个Byte存储(最多到6个Byte)。UTF-8有一个很好的优点,就是它对于ASCII码是向下兼容的,所以英美国家的人用的时候分不出什么区别,也方便了这种编码方式的推广。

所以综上所述,Unicode是一个字符集,UTF-8,UTF-16,UTF-32都是这个字符集上的编码方式。而ASCII,GBK等都是其它字符集,他们由于没有像Unicode这样将编码和抽象表示解耦,所以默认都只有一个对应的编码方式。

在vs中,对应了两个数据结构,一个是wchar_t一个是char。其中char采用的是mbcs,通常是ascii码,utf-8或者gbk(纯中文字符集)。而wchar_t则是用的wcs,通常就是utf-16了。在字符“”或者''前加L就代表宽字符,比如L“我”。

所以你现在应该了解了Unicode和bytes的区别了。(我好像跑题了....)


参考资料:
[1] Jason Gregory说的程序员必读博文之一 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
[2] Plane (Unicode)
 
posted @ 2021-03-08 15:15  岭南春  阅读(449)  评论(0)    收藏  举报