ASCII,Unicode和UTF-8之间的关系

 ASCII码:

上个世纪60年代美国制定了一套字符编码,对英语字符与二进制位之间的关系做了统一规定,这就是我们常说的 ASCII 码。ASCII 码一共规定了128个字符的编码,比如空格SPACE是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的一位统一规定为0

非ASCII编码:

 英语用128个符号编码就够了,但是用来表示其他语言128个符号是不够的。比如在法语中字母上方有注音符号,它就无法用 ASCII 码表示。比如汉字就多达10万左右。

如果有一种编码能将世界上所有的符号都纳入其中,也就是说每一个符号都有一个独一无二的编码那么乱码问题就会消失。这就是 Unicode(统一码)显然Unicode是一个很大的集合,现在的规模可以容纳100多万个符号。

需要注意的是Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。

UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。重复一遍,这里的关系是,UTF-8 是 Unicode 的实现方式之一!!!!!!!!!!!!!!!!

UTF-8 最大的一个特点:它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8 的编码规则很简单,只有如下二条:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
下表总结了编码规则,字母x表示可用编码的位。

    Unicode符号范围      |      UTF-8编码方式
    (十六进制)           |       (二进制)
----------------------+---------------------------------------------
(0000 0000)-(0000 007F) | 0xxxxxxx
(0000 0080)-(0000 07FF) | 110xxxxx 10xxxxxx
(0000 0800)-(0000 FFFF) | 1110xxxx 10xxxxxx 10xxxxxx
(0001 0000)-(0010 FFFF) | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

 跟据上表,解读 UTF-8 编码非常简单。如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。还可以发现,ASCII编码实际上可以被看成是UTF-8编码的一部分。

Unicode 规范定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做"零宽度非换行空格"(zero width no-break space),用FEFF表示。这正好是两个字节,而且FF比FE大1。如果一个文本文件的头两个字节是FE FF,就表示该文件采用大头方式;如果头两个字节是FF FE,就表示该文件采用小头方式。(多字节编码在存储和传输时才存在大小端问题,如UTF-16,UTF-32, UTF-16BE 表示大端,UTF-16LE 表示小端)

搞清楚了ASCII、Unicode和UTF-8的关系,我们就可以总结一下现在计算机系统通用的字符编码工作方式:

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。

用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:

浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:

 所以你看到很多网页的源码上会有类似<meta charset="UTF-8" />的信息,表示该网页正是用的UTF-8编码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值