「计算机知识随记」Unicode 与 UTF-8 和仍然存在的乱码问题

0 背景

中文维基百科对Unicode 的定义是:

如果有一种编码,将世界上所有的符号都纳入其中。
每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。

可是在Unicode已经发布的(Unicode1991年发布,UTF-8 是 1993 年初发布)三十年中,编码问题并没有解决,我仍然会遇到编码问题?为什么呢?

1 Unicode

1.1 Unicode之前

介绍Unicode前,需要先介绍计算机历史:

计算机由美国人发明,对于当时计算机的"UI"概念来说,屏幕显示的字符自然是英语,由于英语字符比较少,当时推出的ASCII编码就可以表示"全部"(英文所用到的)字符.

随着计算机不断发展,非英语区的人们也接触到了计算机,但传统计算机只支持ASCII编码表的字符,对于非英语区的人们使用很吃力,解决办法是使用不同语言的人都出了一套收录自己文字的字符编码(也就是i18n~)

Unicode出来前,各个国家和地区使用不同的编码规则(编码集):中国有GB2312-80(GBK前身),日本有JIS(Shift_JIS前身).

由于这些编码规则是为了特定人群(例:使用简体汉字的人)使用的,所以只会覆盖特定人群使用的(常用)字符,对于其他语言的字符自然不能很好支持(例:GB2312-80不支持藏文等).

自然,A编码集规则下编写的文章由B编码集规则打开自然会出现转换错我的情况,A编码集下"爱"在B编码集对应的是"恨"这种情况也是可能的

1.2 Unicode之后

上述各自为政的情况自然会让人想到:

如果有一种编码,将世界上所有的符号都纳入其中,这样全世界人仅需要使用该编码进行交流,就可以避免乱码问题!因为全世界使用的是同一套规范!类似世界语之于英语/华语/西语!

说回Unicode:
Unicode 本质是将每一个字符规定了唯一的映射值(即码点 code point)

这些字符对于的码点有什么用?根据这些码点,可以编写编码算法,编码算法指示字符以二进制存储到存储设备的"形态",类似UTF-8/UTF-16/UTF-32.

别看有这么多实现算法,本质上是存储空间和检索时间的不同平衡.

也可以这么理解:Unicode 是理论抽象,是一种规范,而UTF-8等编码算法是对Unicode理论的实现

2. 仍然存在的乱码问题

本质上,Unicode的实现编码算法是"世界"级别的,而Shfit_JIS等编码算法是"国家/地区"级别

但是为什么在Unicode问世三十年之后还会存在问题呢?
核心是微软(Windows)为了保证兼容性,为了保证使用了老地区编码的API的应用程序正常使用,哪怕Windows的内核已经用unicode编码,但是对于应用程序Windows允许使用不同的字符集,所以默认字符集仍然是各个国家/地区的编码集,没有改为unicode的实现编码集

除非某天Windows放弃非unicode的程序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值