字符编码小结

227 阅读2分钟

最近想要用typedArray和sharedArrayBuffer,嗯,看完文档发现只有int、float的array,都是给数字的,那字符串咋搞? 编码呗。 Ascii? utf-8? 这玩意儿到底搞了啥? 不清楚啊。 所以就翻了大佬们的一些博客学习了一下。

ASCII码

计算机里所有信息都是拿二进制位来存的(0,1)。 所以1个字节就可以存256种状态。ASCII码就把所有英文字符都划分在了32-127之间的状态里。 比如A在ASCII里就是65.

因为ASCII只规定到了127.只用了7位,所以规定第一位全部都为0.

Unicode

ASCII码解决了英文字符的问题,那其他字符咋办? 比如法文,希腊文? 欧洲各个国家就利用了ASCII没有用的第一位字符,自己搞了一堆体系,然后你用你的,我用我的。 所以邮件里会出现文案乱七八糟的情况。

怎么解决呢?要解决各搞各的,那就出一套统一的咯。所以就诞生了unicode。unicode给世界上所有的符号都赋予了一个编码。

那unicode是怎么容纳所有字符的呢? 答案很简单,用更多的空间。。 比起ASCII码只用了7位,只需要一个字节,unicode可能会占到2个、3个、4个字节,甚至更多。

这么搞老美就不干了啊,我的英文字符一个字节就够了,你搞一套东西出来我要用加倍的空间去存,肯定不划算啊。

UTF-8

为了解决上面的问题,大佬们又搞出了一套utf-8的实现。utf-8最大的特点就是,长度不固定,老美写的英文字符,用utf-8编码就只要1个字节,咱写的中文字符,就要多个字节。 然后对于1个字节的符号,第一位为0. n个字节的符号,第一个字节的前n位都为1,n+1位为0.后面字节的前两位都为10。 所以编码的时候,看到第一位为1的,就数数有几个1,有几个就占几个字节。

比如“双”字, unicode的值为53CC(1001001111001100),根据上面的规则,转成utf-8就变成111010011000111110001100。

嗯,这么一搞,大家都开心了。。

参考文献

字符编码笔记:ASCII,Unicode 和 UTF-8

The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)