中文维基百科对Unicode 的定义是:
如果有一种编码,将世界上所有的符号都纳入其中。
每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。
可是在Unicode已经发布的(Unicode1991年发布,UTF-8 是 1993 年初发布)三十年中,编码问题并没有解决,我仍然会遇到编码问题?为什么呢?
介绍Unicode前,需要先介绍计算机历史:
计算机由美国人发明,对于当时计算机的"UI"概念来说,屏幕显示的字符自然是英语,由于英语字符比较少,当时推出的ASCII编码就可以表示"全部"(英文所用到的)字符.
随着计算机不断发展,非英语区的人们也接触到了计算机,但传统计算机只支持ASCII编码表的字符,对于非英语区的人们使用很吃力,解决办法是使用不同语言的人都出了一套收录自己文字的字符编码(也就是i18n~)
Unicode出来前,各个国家和地区使用不同的编码规则(编码集):中国有GB2312-80(GBK前身),日本有JIS(Shift_JIS前身).
由于这些编码规则是为了特定人群(例:使用简体汉字的人)使用的,所以只会覆盖特定人群使用的(常用)字符,对于其他语言的字符自然不能很好支持(例:GB2312-80不支持藏文等).
自然,A编码集规则下编写的文章由B编码集规则打开自然会出现转换错我的情况,A编码集下"爱"在B编码集对应的是"恨"这种情况也是可能的
上述各自为政的情况自然会让人想到:
如果有一种编码,将世界上所有的符号都纳入其中,这样全世界人仅需要使用该编码进行交流,就可以避免乱码问题!因为全世界使用的是同一套规范!类似世界语之于英语/华语/西语!
说回Unicode:
Unicode 本质是将每一个字符规定了唯一的映射值(即码点 code point)
这些字符对于的码点有什么用?根据这些码点,可以编写编码算法,编码算法指示字符以二进制存储到存储设备的"形态",类似UTF-8/UTF-16/UTF-32.
别看有这么多实现算法,本质上是存储空间和检索时间的不同平衡.
也可以这么理解:Unicode 是理论抽象,是一种规范,而UTF-8等编码算法是对Unicode理论的实现
本质上,Unicode的实现编码算法是"世界"级别的,而Shfit_JIS等编码算法是"国家/地区"级别
但是为什么在Unicode问世三十年之后还会存在问题呢?
核心是微软(Windows)为了保证兼容性,为了保证使用了老地区编码的API的应用程序正常使用,哪怕Windows的内核已经用unicode编码,但是对于应用程序Windows允许使用不同的字符集,所以默认字符集仍然是各个国家/地区的编码集,没有改为unicode的实现编码集
除非某天Windows放弃非unicode的程序