我对字符编码的理解

背景

开发这些年,一直有遇到字符编码这些问题,能一直在解决,但始终没有做到通透的水平,现在想尝试做一下归纳与总结。尝试从一个完全不懂的小白的角度,把问题讲清楚。

问题

  • 为什么会存在字符编码?
  • 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,其他的尚未求证是否存在。待补充。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值