Unicode 和 UTF-8 的区别

      我们知道,所有在计算机上看到的文本,图像,音乐都是以字节流的形式存放在硬盘上或在网络上传输的。我们把前者转化为后者的过程称为编码(Encoding),反之则为解码(decoding)。相比于图像,音乐而言,对文本的编码相对简单的。实际上,一段文字就是一个字符串String,它是由一系列的字符(Character)组成。对其编码就是将每个字符映射为一个数字。这种编码方式看起来不复杂,但是映射方式可以有很多种。在Unicode出现之前就已经有了很多的字符集,包括我们熟悉的ASCII,GBK,BIG5。正是大量不同字符集的存在带了一个我们经常听到的问题:乱码。所谓乱码就是decoding和encoding使用的字符集不兼容,导致一些字符没有被正确的解析。再进一步讨论这个问题之前,首先要引入几个概念:

  • Character Repertoire 定义了其所支持的所有抽象字符的全集。比如说可以为所有英文字母,数字以及简单的符号定义一个Repertoire。
  • 在定义了一个Character Repertoire 之后,我们就需要赋予其中每个字符单位一个唯一的大于0的Code Point。在完成这样的映射之后,我们就创建了一个Coded Character Set (字符集)。比如说,我们所熟悉的ASCII字符集一个有127个字符,其对应的编码也就是从1到127中。而Unicode定义的这个集合就要大得多,目前5.2版本包括107,361个字符。理论上,它可以定义1,114,112个字符(0 - 0x10FFFF)。为了方便管理和扩展性,这个范围给划分成若干段,每段用来表示不同种类的字符。
  • 接下来,Character Encoding Scheme (字符编码)就会用来指定如何把每个字符的code point映射为可以传输的字节序列。常见的基于Unicode的编码方式有UTF-8,UTF-16和UTF-32。其中, UTF-8的最大的优点就是它能够向前兼容ASCII编码,因为这个原因,它就成为了目前最为流行的编码方式。

      继续我们的讨论。为了避免出现乱码,我们必须要在解码之前知道这个字符流使用的编码。HTML和XML采取了定义元数据的方法。所谓元数据,是指数据的属性,而数据的编码正是其中的一种。在HTML中,我们可以在head元素中加入这一行来指定解析这一网页要使用的编码:<meta http-equiv="content-type content-type="text/html;charset=UTF-8" />。当然,除此以外,我们也可以在HTTP响应头中使用content-type来指定相同的信息,这种方法具有更高的优先级。而对于XML文件而言,你所需要做的就是在文件的第一行指定<?xml version="1.0" encoding="UTF-8" ?>。

你可能感兴趣的:(html,xml,Scheme,音乐)