今天复习一些基础的时候,又看到”编码方式“的这个名词了。
搜索了一些资料,算是搞清了ASCII、unicode、UTF-8的关系了。
1、ASCII
ASCII是很久之前美国制定的一套字符编码,是英文字符到某个id的一个映射。
这个编码方式用一个字节来表示英文字符,但字节的最高位固定为0,可用字节位数为7位。
也就是说,ASCII最多只能表示2^7 = 128个字符
2、unicode
单单ASCII肯定是不够用的,毕竟世界上有那么多国家,不同国家之间很多都使用不同的语言。
在没有unicode的时候,各个国家自己可能都有一套编码方式,这对交流带来很大的不便。
为了统一,就出现了unicode。
简单来讲, unicode的目的就是为世界上的字符制定一个从字符到独一无二的id的映射。
可以从http://www.unicode.org/Public/UCD/latest/charts/这个网站下载unicode的编码表。
3、UTF-8
UTF-8是unicode的一种实现方式,实现了unicode的存储,同时与ASCII兼容。
unicode只规定了每个字符对应的id,并没有规定字符应该如何存储。
4、GB2312
兼容ASCII编码的汉字编码表,包含了常用的汉字的编码(也就是说,没有包含所有的汉字)
下面做个试验。打开记事本,分别用ASCII、unicode、UTF-8的方式保存"你a"这两个字。
用16进制方式打开,可以看到存储的字节:
ASCII: C4 E3 61
unicode:FF FE 60 4F 61 00
UTF-8:EF BB BF E4 BD A0 61
"a"的ASCII值为0x61
从unicode编码表可以查到"你"对应的值为0x4F 0x60
而从http://www.knowsky.com/resource/gb2312tbl.htm中的GB2312表中,我们可以查到"你"对应的值为0xC4 0xE3
刚好与上面贴出的存储字节相对应。
另外一点, 记事本所谓的保存方式,在我看来,是很不严谨的。
unicode只是规定了字符的映射关系,并没有规定字符该如何存储,记事本里用某种实现方式来代表unicode。
ASCII也只是规定了英文字符的映射(存储)方式,并没有规定汉字该如何存储,记事本里用GB2312(也许是?)
来代表ASCII。
这些很容易给人带来误导。
搜索了一些资料,算是搞清了ASCII、unicode、UTF-8的关系了。
1、ASCII
ASCII是很久之前美国制定的一套字符编码,是英文字符到某个id的一个映射。
这个编码方式用一个字节来表示英文字符,但字节的最高位固定为0,可用字节位数为7位。
也就是说,ASCII最多只能表示2^7 = 128个字符
2、unicode
单单ASCII肯定是不够用的,毕竟世界上有那么多国家,不同国家之间很多都使用不同的语言。
在没有unicode的时候,各个国家自己可能都有一套编码方式,这对交流带来很大的不便。
为了统一,就出现了unicode。
简单来讲, unicode的目的就是为世界上的字符制定一个从字符到独一无二的id的映射。
可以从http://www.unicode.org/Public/UCD/latest/charts/这个网站下载unicode的编码表。
3、UTF-8
UTF-8是unicode的一种实现方式,实现了unicode的存储,同时与ASCII兼容。
unicode只规定了每个字符对应的id,并没有规定字符应该如何存储。
4、GB2312
兼容ASCII编码的汉字编码表,包含了常用的汉字的编码(也就是说,没有包含所有的汉字)
下面做个试验。打开记事本,分别用ASCII、unicode、UTF-8的方式保存"你a"这两个字。
用16进制方式打开,可以看到存储的字节:
ASCII: C4 E3 61
unicode:FF FE 60 4F 61 00
UTF-8:EF BB BF E4 BD A0 61
"a"的ASCII值为0x61
从unicode编码表可以查到"你"对应的值为0x4F 0x60
而从http://www.knowsky.com/resource/gb2312tbl.htm中的GB2312表中,我们可以查到"你"对应的值为0xC4 0xE3
刚好与上面贴出的存储字节相对应。
另外一点, 记事本所谓的保存方式,在我看来,是很不严谨的。
unicode只是规定了字符的映射关系,并没有规定字符该如何存储,记事本里用某种实现方式来代表unicode。
ASCII也只是规定了英文字符的映射(存储)方式,并没有规定汉字该如何存储,记事本里用GB2312(也许是?)
来代表ASCII。
这些很容易给人带来误导。