背景
开发这些年,一直有遇到字符编码这些问题,能一直在解决,但始终没有做到通透的水平,现在想尝试做一下归纳与总结。尝试从一个完全不懂的小白的角度,把问题讲清楚。
问题
- 为什么会存在字符编码?
- gbk、unicode是什么?
- UTF-8、UTF-16等与UNICODE什么关系?
- mysql里面存储的是数据,编码是解释层面的概念,而存储的时候,理论上都只是二进制而已,为什么存储的时候,需要指定什么类型的编码?
- 对于一个文本文件,如何知道其采用什么编码?
我的理解
为什么会存在字符编码?
最开始的时候,只是英文世界里面存在计算机。对于计算机而言,他只认识一些基本的字节,不认识所谓的英文。为了显示26个字母,出现了最早的ASCII码。可以简单的理解为,当某个字节如果被解释成字符的时候,那么,就参考ASCII码的映射关系。例如:值为0x41的时候,就显示字符”A“。英文字符,加上一些其他的运算符,基本上ASCII码表就能解决问题了。
然而,其他国家也加入了互联网世界。每个国家有自己的文字,需要一套从字节,转换成显示的一套映射规则。所以就出现各种字符编码。
unicode
像我国,由于历史原因,先后推出了几个编码标准,有gbk,gb18030等。为了数据信息方便的在全世界交换,出现了一个统一的标准,UNICODE。UNICODE是一个字符编码表,可以简单的理解为是一个大表。key是一个数值,value是对应的一个字符。所有语言的任何字符,都能在UNICODE中找到一个唯一的值与其对应。那么,传输文本的时候,如果使用UNICODE方案,那就非常简单和清晰了。
UTF-8、UTF-16等与UNICODE什么关系?
有了UNICODE,那么传输的时候,其实就是传输对应的UNICODE的KEY的值。而UNICODE中,总共需要4个字节。如果全部是英文的话,理论上只需要1个字节就足够表达了。因此,就出现了UTF-8等将UNICODE字符集转换成数值的一种映射算法机制,我们称之为UTF-8编码。UTF-8、UTF-16、UTF-32等本质上都是如何把UNICODE字符集转成数值,达到用更少的空间来表达的目的。具体转换算法,可以参考互联网上的解读。
mysql里面存储的是数据为什么需要指定编码类型?
从存储数据的角度,确实无须存储什么编码。如果拿到数据的解释程序知道是什么编码,直接存即可。然而,从mysql的客户端角度,更友好的做法,应该是我给你一段数据的同时,我告诉你这段数据采用的是什么编码,你才能正确解释出来,这就是mysql需要保存编码信息的原因了。
对于一个文本文件,如何知道其采用什么编码?
对于常见的如UTF-8文件,其开头有一个固定的头,efbbbf,其他的尚未求证是否存在。待补充。