ASCII,UTF-8和Unicode字符编码规范
来源:互联网 发布:微软笔记软件 编辑:程序博客网 时间:2024/05/01 23:16
ASCII
ASCII码一共规定了128个字符的编码,只占用了一个字节的后面7位,最前面的1位统一规定为0。比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号)。
Unicode
正如上一节所说,世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。
可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。
Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字“严”。具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表。
Unicode的问题
需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
比如,汉字“严”的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。
这里就有两个严重的问题,第一个问题是,如何才能区别unicode和ascii?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。
它们造成的结果是:1)出现了unicode的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示unicode。2)unicode在很长一段时间内无法推广,直到互联网的出现。
UTF-8
UTF-8是Unicode的一种实现方式,也就是它的字节结构有特殊要求,所以我们说一个汉字的范围是0X4E00到0x9FA5,是指unicode值,至于放在utf-8的编码里去就是由三个字节来组织,所以可以看出unicode是给出一个字符的范围,定义了这个字是码值是多少,至于具体的实现方式可以有多种多样来实现。
UTF-8是一种变长字节编码方式。对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的字节数,其余各字节均以10开头。UTF-8最多可用到6个字节。
如表:
1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
因此UTF-8中可以用来表示字符编码的实际数据位数最多有31位(6个字节时),即上表中x所表示的位。除去那些控制位(每字节开头的10等),这些x表示的位与UNICODE编码是一一对应的,位高低顺序也相同。
UNICODE转UTF-8:实际将UNICODE转换为UTF-8编码时应先去除高位0,然后根据所剩编码的位数决定所需最小的UTF-8编码位数。
因此那些基本ASCII字符集中的字符只需要一个字节的UTF-8编码(7个数据位)便可以表示。
而汉字的范围是0X4E00到0x9FA5(即0100 1110 0000 0000到 1001 1111 1010 0101需15个数据位),需用三个字节表示。
- ASCII,UTF-8和Unicode字符编码规范
- 字符编码:ASCII,Unicode和UTF-8
- 字符编码:ASCII,Unicode和UTF-8
- 字符编码:ASCII,Unicode和UTF-8
- 字符编码:ASCII,Unicode和UTF-8
- 字符编码:ASCII,Unicode和UTF-8
- 字符编码:ASCII,Unicode和UTF-8
- 字符编码ASCII,Unicode和UTF-8
- 字符编码:ASCII,Unicode和UTF-8
- 字符编码:ASCII,Unicode和UTF-8
- 字符编码:ASCII,Unicode和UTF-8
- 【字符编码】 ASCII、Unicode和UTF-8
- 字符编码:ASCII,Unicode和UTF-8
- 字符编码 - ASCII,Unicode和UTF-8
- 字符编码:ASCII,Unicode和UTF-8
- 字符编码:ASCII,Unicode和UTF-8
- 字符编码:ASCII,Unicode和UTF-8
- 字符编码ASCII,Unicode和UTF-8
- HDU 1159 Common Subsequence
- 等概率随机函数的实现 .
- Android如何防止apk程序被反编译(尊重劳动成果)
- python中的ctypes库初探
- Flip Game
- ASCII,UTF-8和Unicode字符编码规范
- EL表达式详解
- 捕捉 程序关闭或者 进入后台事件
- android 开发环境搭建及hello world
- 杭电 1308 What Day Is It?
- 程序员有哪些发展方向
- Lustre的安装与配置
- e-人事管理系统-教育培训-应用流程
- Ural 1732. Ministry of Truth 多串匹配KMP