The hard ways

字符集和字符编码

之前已经了解过一些 Unicode 和 UTF-8 之前的关系,见 UTF-8 编码及检查其完整性

今天在看 ICU 文档的时候,又再一次看到 codepage 这个参数,比如 u_fopen,于是想了解一下 code page 和 character set、character encoding 之间的关系

代码页「Code Page」,也被称为 字符编码「Character Encoding」维基百科上还解释称代码页也被称为内码,,初一看确认让人感觉云里雾里的,不排除中文翻译的问题内码表示的是操作系统或者应用程序内部使用的编码,简称为「内码」相信有人会和我一样,最初会以为代码页只的是很多编码格式的集合,单其实不是,一个代码页对应一个字符编码格式

字符集「Character Set」,这里的集合「Set」表示的是字符与指代它们的数字之间的对应关系的集合,比如:

a_character_set = {
  'a': 1,
  'b': 2
}

那么字符集与字符编码有什么不同吗?区别就在于,编码引入了转换处理的过程我们拿 Unicode 和 UTF-8 来举例Unicode 就是字符集,我们通常可以使用 UInt32 来表示一个字符对应的 Unicode 中的数字,就好比上面的例子而 UTF-8 被称为字符编码的原因,就是因为它包含了将原本需要 UInt32 即 4 个字节表示的字符,处理成需要 1~4 个不等的字符来表示的形式,这其中的转换就是编码的工作含义我们甚至可以将 Character Set 理解为最简单的 Character Encoding

如果我们打开浏览器控制台检查「Inspect」一个请求的话,会发现在 Response Headers 中有:

Content-Type: text/html; charset=UTF-8

我们发现 UTF-8 是作为 charset 的值,为什么这里不是 char-encoding 呢?这是因为 HTTP 标准制定诞生在 Unicode 标准之前,那时都是使用 Character Set 的形式,而在 Unicode 系列标准出现后,为了保证兼容性 HTTP 标准保留了 charset 的使用

参考:

    Made with gadget