开始计算机只在美国用。计算机只识别'1'和'0',八位的字节一共可以组合出256(2的8次方)种不同的状态。最初美国人做计算机编码只针对英文字母和字符,把所有的空格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第127号,这样计算机就可以用不同字节来存储英语的文字了。这个方案叫做 ANSI 的”Ascii”编码(American Standard Code for Information Interchange,美国信息互换标准代码)。当时世界上所有的计算机都用同样的ASCII方案来保存英文文字。后来世界上各个国家都要使用计算机,128-255被成为“扩展字符集”,显然不够用。
ISO (国际标谁化组织)定制了国际化通用的编码法则”Universal Multiple-Octet Coded Character Set”,简称 UCS, 也就是“unicode“。其规定必须用两个字节,也就是16位来统一表示所有的字符,对于ASCII里的那些“半角”字符,unicode包持其原编码不变,只是将其长度由原来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于”半角”英文符号只需要用到低8位,所以其高8位永远是0,因此这种方案在保存英文文本时会多浪费一倍的空间。
当时带宽相当昂贵,面对需要传输的众多无用数据,面向传输的众多 UTF(UCS Transfer Format)就应运而生,UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。UTF-8可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
实际应用过程中,计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。大概关系如下(廖雪峰的博客):
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:
unicode_utf-8_text.png
浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:
unicode_utf-8_net.png
其他的一些概念:
计算机内只能保存101010等二进制数据,那么页面上显示的字符是如何显示出来的呢?
一:字符集(Charset)charset = char + set,char 是字符,set是集合,charset就是字符的集合。字符集就是是这个编码方式涵盖了哪些字符,每个字符都有一个数字序号。
二:编码方式(Encoding)编码方式就是一个字符要怎样编码成二进制字节序,或者反过来怎么解析。也即给你一个数字序号,要编码成几个字节,字节顺序如何,或者其他特殊规则。
三:字形字体(Font)根据数字序号调用字体存储的字形,就可以在页面上显示出来了。所以一个字符要显示出来,要显示成什么样子要看字体文件。
综上所述,Unicode 只是字符集,而没有编码方式。UTF-8 是一种 Unicode 字符集的编码方式,其他还有 UTF-16,UTF-32 等。而有了字符集以及编码方式,如果系统字体是没有这个字符,也是显示不出来的。
网友评论