字符编码笔记
字节与比特
我们都知道,一个字节由8位二进制表示。
字节是计算机中数据处理的基本单位,计算机中以字节为单位存储和解释信息。
比特表示二进制“位”,位是计算机内部数据存储的最小单位,00000000
是一个8位二进制数表示的一个字节,即1个字节等于8比特
ASCII 码
一个字节有2^8种组合,即可以表示256种状态。计算机由美国发明,他们只占用了一个字节的后7位即2^7=128
个状态来表示他们的英语字母,数字与符号,这被称为ASCII 码
。
占用高位
使用计算机的国家多了,128个字节是不能表示他们的字符的,于是他们占用最高位,来扩充了128-255个字节,不变的始终是0-127位,始终是标准的ASCII 码。
后面发现占用高位也不能满足字符的表示了,因为始终是一个字节表示一个字符,称为单字节字符。于是开始组合字节来表示一个字符。
十六进制与二进制与字节
十六进制用0000 - ffff来表示,1个十六进制如果用二进制来表示
f = 1111 = 15
即2个十六进制才能表示一个字节即8位
ff = 11111111 = 255
那么,一个十六进制需要2字节来表示
https://www.cnblogs.com/gaizai/p/4233780.html#_labelConvert34
Unicode
Unicode是一个通用的字符集合,用来统一全世界的字符,Unicode编码方案为字符集中的每一个字符指定了统一且唯一的二进制编码。
Unicode使用16位二进制的编码空间,也就是每个字符占用2个字节,ASCII是用8位。
Unicode理论上最多可表示2^16=65536
个字符,上述16位统一码字符构成一个基本多文种平面。
Unicode不是一次性定义的,而是分区定义。每个区可以存放65536个(216)字符,称为一个平面(plane)。目前,一共有17个(2^5)平面,也就是说,整个Unicode字符集的大小现在是2^21。
基本多文种平面的字符的编码为U+hhhh,其中每个h代表一个十六进制数字。
最前面的65536个字符位,称为基本平面(缩写BMP),它的码点范围是从0一直到2^16-1,写成16进制就是从U+0000到U+FFFF。所有最常见的字符都放在这个平面,这是Unicode最先定义和公布的一个平面。
utf-8
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码。
为了不占用浪费空间,原本只需要一字节表示的字母如果用多字节表示就浪费了。
UTF-8可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
https://baike.baidu.com/item/UTF-8
在Unicode标准中,我们目前使用的是UCS-4,即字符集中每一个字符的字符代码都是用4个字节来表示,其中字符代码0~127兼容ASCII字符集,一般的通用汉字的字符代码也都集中在65535之前,使用大于65535的字符代码,即需要超过两个字节来表示的字符代码是比较少的。因此,如果仍然依旧采用字符代码和字符编码相一致的编码方式,那么英语字母、数字原本仅需一个字节编码,目前就需要4个字节进行编码,汉字原本仅需两个字节进行编码,目前也需要4个字节进行编码,这对于存储或传输资源而言是很不划算的。
因此就需要在字符代码和字符编码间进行再编码,这样就引出了UTF-8、UTF-16等编码方式
https://www.zhihu.com/question/57461614
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
javascript 与字符编码
由于JavaScript只能处理UCS-2编码,造成所有字符在这门语言中都是2个字节,如果是4个字节的字符,会当作两个双字节的字符处理。JavaScript的字符函数都受到这一点的影响,无法返回正确结果。
也就是说对于4字节的字符,js的都会用2个字节去处理。
在js中,unicode的表示直接用码点表示,写法是"反斜杠+u+码点"。
'\u0041' === 'A' // true
js将字符转为unicode
'A'.charCodeAt(0).toString(16) === '41'