在计算机的世界中一个字符用哪个数字来表示,有很多标准,下面一一介绍。
1、ASCII
ASCII 是 “American Standard Code Information Interchange”的缩写,美国信息交换标准码。在英美常用字母就26分,区分大小写,加上标点符号也超不过127个。2^7 = 127。因此每一个字符用一个字节表示足够了。一个字节的7位表示128个数值,在ASCII码中最高位永远是0.
2、 ANSI
参考链接:https://www.cnblogs.com/malecrab/p/5300486.html
ANSI包容ASCII码。ANSI对于ASCII字符仍以一个字节来表示,对于非ASCII字符则使用2字节表示。并没有固定的ANSI编码,它跟计算机的“本地化”密切相关,比如在中国大陆地区,ANSI编码默认是 GB2312,在港澳台地区的默认编码是BIG5。因为ASCII字符的bit7都是0,当ANSI发现bit7不是0时,就可以判定它不是ASCII码,从而区分哪些是ASCII码,哪些不是ASCII码。使用ANSI时,同一个值在不同的字符集下代表不同的意思。以下图为例讲:以数值“0xd0d6”为例,对于 GB2312 编码它表示“中”;对于 BIG5 编码它表示“笢”。
这个问题的原因在于没有统一的编码。解决方法就是使用统一的编码:UNICODE.
unicode解决了数值和字符一对多的关系。
UNICODE
UNICODE 中的数值范围是 0x0000 至 0x10FFFF,可以表示 100 多万个字符,足够地球人使用了。
UNICODE 编码实现:
先总结下其他的编码实现:
- ASCII 编码中使用一个字节来表示一个字符,只用到其中的 7 位,最高位恒为 0;
- ANSI 编码中,对于 ASCII 字符仍使用一个字节来表示(BIT7 是 0),对于非 ASCII 字符一般使用 2 个字节来表示,非 ASCII 字符的数值 BIT7 都是 1。
如何表示一个UNICODE
1、使用三个字节表示,弊端:浪费
2、UTF-16 LE 用两个字节表示,小端模式(权重小的放在前边表示),可以标识2^16 = 65536个字符。
3、UTF-16 BE 用两个字节表示,大端模式(权重大的放在前边表示)。
4、UTF8 变长的编码方法。不局限于只用两个字节或者三个来表示。如果是ASCII字符,直接用ASCII码来表示。对于非ASCII字符,使用变长的编码方式:每一个字节的高位都自带长度信息。同时还可以解决对于UTF-16 LE UTF-16 BE 来表示UNICODE值时,如果某个字节丢失,会使得后面的所有字符因为错位而无法显示的问题。
举例:
"A中"的unicode 的编码值为0x41 0x4e2d。
UTF-16 LE 编码实现的表示方式:ff fe 41 00 2d 4e // ff fe 表示 UTF-16 LE
UTF-16 BE 编码实现的表示方式:fe ff 00 41 4e 2d // fe ff 表示UTF-16 BE
UTF8 编码实现的表示方式:4e e4 b8 ad // 不带有头部的UTF8
UTF-8 编码实现的表示方式:ef bb bf 41 e4 b8 ad // ef bb bf 表示带有头部的UTF8