你脑子里关于字符集的疑问都收录在这!
本文希望解答以下几个问题:
- 什么是字符集,ASCII码、unicode、UTF-8、GB2312、GBK 之间有什么区别?
- 给定一个字符串,如何检测其编码类型
- 如此多的字符集,平时改怎么选用合适的?
- 字符编码之间如何转换?
- 对于mysql,表、字段都有字符集,如何统一选中哪种?
- mysql的utf8mb4是uft8有何区别
- mysql中默认的lantin1字符集又是什么字符集?
ASCII码、unicode、UTF-8、GB2312、GBK 四者有什么区别?
ASCII码
上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。
ASCII码一共规定了128个字符的编码,比如空格"SPACE"是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。
但是对于非英语语言,128个字符远远不够容纳,比如常用汉字就有数万个。于是就延伸了其他的字符编码。
unicode
正如上一节所说,世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。
可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。
Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字"严"。具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表。
注意:unicode约定了一种符号集,几乎囊括了所有符号,但不是一种具体存储的字符集。 下面要讲的utf-8就是其一种实现方式。
UTF-8
UTF-8就是在互联网上使用最广的一种Unicode的实现方式。
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
GBK2312和GBK
GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。
GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符
给定一个字符串,如何检测其编码类型?
php中的mb_detect_encoding函数原理是什么
https://segmentfault.com/q/1010000000958096
mysql的utf8mb4是uft8有何区别
mysql默认的lantin1是什么字符集
http://stackoverflow.com/questions/2708958/differences-between-utf8-and-latin1
MySQL字符集UTF8与GBK之间如何选择
http://www.qttc.net/201207125.html
GBK固定2个字节,UTF-8变长
GBK就是在保存你的帖子的时候,一个汉字占用两个字节。。外国人看会出现乱码,此为我中华为自己汉字编码而形成之解决方案。
UTF8就是在保存你的帖子的时候,一个汉字占用3个字节。。但是外国人看的话不会乱码,此为西人为了解决多字节字符而形成之解决方案。