比特、字节、字符
一个二进制位(bit)存在0和1两种状态,一个字节(byte)由8个二进制位组成,存在256种状态,每个状态如0100 0000 可用来对应字符。
ASCII码就规定了128个字符的编码,如SPACE空格是32(为0010 0000)、A是65(01000001)等128个符号
非ASCII码: 英文可用128个符号覆盖,但其他语言是不够的,所以也用一个字节表示自己的文字,这样每个字符代表的字母就不一样了。亚洲国家汉字不同于字母,无法组合完成,数量巨大,可以通过多个字节组合实现扩充,如简体中文常见的编码方式是GB2312,用两个字节表示一个字符。。
ASCII→GB2312(1980年)→GBK→GB18030(PC平台必然支持),这些GB均为双字节字符,从ASCII均为向下兼容,区分中英文的方法为最高位不为0(GB存储方式为big endian)
(内码为计算机自带的编码方式)
如果编码打开方式和写入方式不同,就会出现乱码。
Unicode 将所有的字符纳入其中,并赋予独一无二的编码。
unicode存在的问题: 1)一部分字符需要三个甚至更多的字节组合,对于本来可以一个字节搞定的字符,很浪费。2)计算机是如何分辨是unicode编码还是ASCII码,错误的识别会导致如unicode字符(3个字节组成),被当做3个字符。
UTF-8是在互联网上使用最广的一种unicode的实现方式, 也就是utf-8是unicode的一种
UTF-8为可变字节,可以用1~3个字节表示。
UTF-8的编码规则:1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
Unicode码可以采用UCS-2格式直接存储,但存储存在Little endian和Big endian的区别。little endian为第二个字符在前,文本文件的头两个字节是FE FF,就表示该文件采用大头方式;如果头两个字节是FF FE,就表示该文件采用小头方式。而UTF-8开头为EF BB BF
参考:
基本参考