什么是编码?什么是 Unicode 编码?
编码是为了将人能识别的字符数字化,使得计算机能够“看”懂
我们知道,计算机只能处理2进制数字,即 0 或 1 ,而人能看懂的是一些有意义的字符。因此,这里就需要将人类能看懂的语言字符转换为计算机能看懂的数字序列(0 1序列),这个过程就是编码。
计算机的编码类型经历了一个由分到合的过程。由于计算机是美国人发明的,所以他们首先提出了一种 ASCII 编码,这种类型的编码将英文世界中的字母和其他符号(如 ! @ # 这类字符)用计算机中的一个字节来表示(计算机中 bit 是最小的处理单位,1字节 = 8 bit ,因此一个字节最多可表示 255 个字符)。打个比方,在ASCII码中,大写字母 U
就表示成 01010101
,我们在计算机上输入一个 U
,在计算机看来实际上是 01010101
的二进制串。这下美国人使用计算机的问题解决了。
然而中国人也要上网,中国人民也想搞出自己的编码。但是问题出现了,除去一些特殊字符,英文世界的语言可以用26个字母排列表示,然而我国汉字千千万万,仅仅1个字节是无法表示的,于是我们想到了用两个字节表示一个汉字——GB2312 编码就应运而生。而且另一个好处在于,GB2312 编码可以兼容 ASCII 编码。而此时,世界上的其他国家也根据自己的文字特点制定出了自己国家的编码。
Unicode 编码可以解决乱码问题
各国都有了自己的编码后又面对交流上的问题——比方说一个汉字在ASCII码的机器上会被识别为一群乱码。为了解决各国间编码不统一的问题,国际标准化组织(ISO)和多语言软件制造商这两个组织合作搞出了 unicode编码,它将所有语言统一到一套编码。 unicode 编码采用两个字节来表示一个字符,这可以涵盖世界上主流使用的字符。
什么是 utf-8 编码? unicode 和 utf-8 编码之间有何关系?
utf-8 可以解决利用 Unicode 存储造成资源浪费的问题
我们看一下 ASCII 和 Unicode 编码。ASCII编码中,U
对应二进制序列是01010101,
而在 Unicode中,U
对应的二进制序列是0000000001010101
。可见,同样表示一个英文字符,利用 Unicode 编码较 ASCII编码将多花费一倍的存储空间,如果存储1T的英文资料,利用 Unicode 将占用2T的资源,这是极大的资源浪费!
将Unicode编码转换为utf-8编码一般(英文字符居多的情况)可以节省存储空间。详细的Unicode转utf-8编码的规则这里不做介绍,有兴趣可以搜索“ utf-8 编码规则”。
utf-8 编码一般可以减少字符编码的长度(特别是英文字符较多的情况),因此它广泛运用在存储和传输的情形下。但是 utf-8 也不是没有缺点,由于在 utf-8 编码的规则下中英文的编码长度不同,因此这使得我们在内存中操作它们时变得很复杂。所以我们在内存中操作的字符使用的一般是 Unicode 编码,比如 Python 。下面一张图将清楚的描述出 Unicode 和 utf-8 编码的关系。
总结
编码是信息从一种形式转换为另一种形式的过程。
Unicode 编码解决了各国间编码格式不兼容的问题,运用在内存处理中。
utf-8 编码是一种可变长编码,是 Unicode 编码根据一套规则转换而来的,运用在传输和存储中。
根据使用场景我们需要选择合适的编码形式。