字符集与字符编码

414 阅读2分钟

关于字符集与字符编码,我会从字符集、字符编码、前后端交互中的编码、Java中的编码、spring boot 中JDBC 编码、Mysql 内部编码等多个维度进行简单的讲述,因为主要关注Java跟MySQL中的编码问题,所以就叫《Java与MySQL字符集与编码》吧。整体的结构如下:

这是第一篇。简单梳理下。

1 现代编码模型

主要分如下几个步骤: (1)字符表 首先有一个字符表的集合,便于表示所有的字符。 (2)字符集 对字符表中的抽象字符编上一个数字,这些数字的集合就是编码字符集。比如常见的Unicode 就是这一层的概念。 (3)字符编码方案 将编码字符集中的整数转换为比特之,便于计算机使用。UTF-8, UTF-16 都是这一层的概念。

2 字符集

常见的有ASCII , 跟Unicode 编码,还有像GBK字符集。

3 代码点与代码单元

代码点:也称码点,就是某个字符在字符集中对应的数字。

代码单元:也称码元。码元的定义见如下描述:


码元(Code Unit)是指一个已编码的文本中具有最短的比特组合的单元。
对于 UTF-8 来说,码元是 8 比特长;对于 UTF-16 来说,码元是 16 比特长。
换一种说法就是 UTF-8 的是以一个字节为最小单位的,UTF-16 是以两个字节为最小单位的。

Java中string.length() 就是计算的码元的个数。如果要计算字符个数,需要使用codePointCount ,来计算码点的个数,因为一个字符,在某一种字符集中的码点肯定是1.

4 编码方案变长与定长

很久之前,字符集跟编码方案是一一对应的,所以也都是定长的。后来随着字符的增多,原有的字符集已经不够用了,于是人们就尝试去扩展字符集。这虽然可以容纳更多的字符了,但是也带来了另外一个问题:存储占空间与效率。比如MySQL中的UTF-8就是阉割的,就是为了容量与效率。

定长带来的争论持续了一段时间,在容量与效率之间很难选择,这怎么能计算机的科学家呢? 于是好多编码方案就产生了变长的设计,在字符集容量、空间与效率之间做了取舍。

5 参考文献

github.com/acmerfight/…

blog.csdn.net/morningsun1…