一种数据类型占用空间的大小是根据数据量的多少及日常使用的频次来划分的。

比如同样是整型,会有int,short和long,Java它们分别占用4字节8字节和2字节。

中华文化生生不息 源远流长,据不完全统计汉字大约有10万个左右,但是根据日常需要,人们使用频次较多的大概在3500个字左右的数量。

这样看来按照总量来为每个汉字编码的话,每个汉字就需要2^24大小的空间,也就是需要3个字节的空间才可以把10万个汉字编完,如果按照常用的汉字编码,2个字节的空间就足够了。

互联网是连接全球的,全世界的资源都会在网络中传播,每个国家都有自己的文字,如果每个国家出一套自己的编码规范,再统统按照自己的规范去转码那可乱了套了,浏览别国的网页显示的会全是乱码。介于此国际出现了一个汇集了全世界文字的编码规范‘万国码’Unicode

Unicode采用不可变定长的4字节大小为文字编码。即不管是ascaii(1个字节)还是汉字都会采用4个字节的大小被编入其中,多余的高位全会被浪费掉,虽然是解决了编码的统一问题,但在网络传播中会带来巨大的多余开销。

但是人贵就贵在有能动性的大脑,这也难不倒我们。这个时候就需要一个使用时即能满足万国码需求,又可以节约空间的规范了,UTF-8登场

它是一个可变长的编码规范,是Unicode最重要的实现之一,使用1~4个字节为每个字符编码,其中汉字在UTF-8中规定当原汉字在Unicode中是2个字节时,会按照约定加入一些规范数据,使得它变成了3个字节,这个加入的约定就可以在存储识别文字的基础上把Unicode也塞进去。

一个汉字有几个字节(一个汉字到底占用几个字节)(1)

上图中第一个字节以1110开头,第二个和第三个字节以10开头,原本的16bit会有规律的分摊到剩余的3字节的空间中,这样UTF-8就完美的解决了空间与编码的兼容问题。

编码问题是流编码中很容易遇到的问题,因为除此之外还有许多的规范,一不小心就会造成乱码,除此之外还有GBK GB18030 ISO-8859-1 UTF-16 UTF-16BE UTF-16LE等,原理都是大同小异,占用的字节也不尽相同。


个人记录 仅供参考 如有错误还请可以不吝赐教

,