Unicode与UTF8:字符集与字符编码的关系
2018-02-07 19:00
253 查看
一、基本概念
1、什么是字符集:字符集只是一个规则集合的名字,字符集 =字库表(character repertoire)、编码字符集(coded character set)、字符编码(character encoding form)。
2、字库表:
字库表是一个相当于所有可读或者可显示字符的数据库,字库表决定了整个字符集能够展现表示的所有字符的范围。
3、编码字符集:(简称字符集,如Unicode、ASCII)
编码字符集,用一个编码值code point来表示一个字符(即该字符在子库表中的位置),这个值称为字符对应于编码字符集(如:Unicode、ASCII)的序号。
4、字符编码:
字符编码,是编码字符集和实际存储数值之间的转换关系。字符,是根据字符编码方案转换为一个二进制数值存储在计算机中的。所以,字符编码是定义在字符集上的映射规则。(字符-------->计算机中的实际存储值)
注意:编码字符集Unicode,有UTF-8、UTF-16、UTF-32等多种字符编码
2、常见的编码字符集(简称字符集)
Unicode:也叫统一字符集,它包含了几乎世界上所有的已经发现且需要使用的字符(如中文、日文、英文)
ASCII:早期的计算机系统只能处理英文,所以ASCII也就成为了计算机的缺省字符集,包含了英文所需要的所有字符。
GB2312:中文字符集,包含ASCII字符集。ASCII部分用单字节表示,剩余部分用双字节表示。
GBK:GB2312的扩展,但完整包含了GB2312的所有内容。
GB18030:GBK字符集的超集,常叫大汉字字符集,也叫CJK(Chinese,Japanese,Korea)字符集,包含了中、日、韩三国语言中的所有字符。
二、实例案例
1、ASCII:ASCII既是编码字符集,又是字符编码
ASCII直接将字符在编码字符集中的序号作为字符在计算机中存储从数值,
例如:在ASCII中A在表中排第65位,序号是65,而编码后A的数值是0100 0001,也即十进制
的65的二进制转换结果。
2、Unicode:
编码字符集:Unicode
字符编码:UTF-8
为了更好的理解后面的实际应用,我们这里简单的介绍下UTF-8的编码实现方法。即UTF-8的物理存储和Unicode序号的转换关系。 UTF-8编码为变长编码。最小编码单位(code unit)为一个字节。一个字节的前1-3个bit为描述性部分,后面为实际序号部分。
如果一个字节的第一位为0,那么代表当前字符为单字节字符,占用一个字节的空间。0之后的所有部分(7个bit)代表在Unicode中的序号。
如果一个字节以110开头,那么代表当前字符为双字节字符,占用2个字节的空间。110之后的所有部分(5个bit)加上后一个字节的除10外的部分(6个bit)代表在Unicode中的序号。且第二个字节以10开头
如果一个字节以1110开头,那么代表当前字符为三字节字符,占用2个字节的空间。110之后的所有部分(5个bit)加上后两个字节的除10外的部分(12个bit)代表在Unicode中的序号。且第二、第三个字节以10开头
如果一个字节以10开头,那么代表当前字节为多字节字符的第二个字节。10之后的所有部分(6个bit)和之前的部分一同组成在Unicode中的序号。
具体每个字节的特征可见下表,其中x代表序号部分,把各个字节中的所有x部分拼接在一起就组成了在Unicode字库中的序号
Byte 1 Byte 2
Byte3
0xxx xxxx
110x xxxx 10xx xxxx
1110 xxxx 10xx xxxx
10xx xxxx
我们分别看三个从一个字节到三个字节的UTF-8编码例子:
实际字符 在Unicode字库序号的十六进制
在Unicode字库序号的二进制 UTF-8编码后的二进制
UTF-8编码后的十六进制
$ 0024
010 0100 0010 0100
24
¢ 00A2
000 1010 0010 1100 0010 1010 0010
C2 A2
€ 20AC
0010 0000 1010 1100 1110 0010 1000 0010 1010 1100
E2 82 AC
细心的读者不难从以上的简单介绍中得出以下规律:
3个字节的UTF-8十六进制编码一定是以E开头的
2个字节的UTF-8十六进制编码一定是以C或D开头的
1个字节的UTF-8十六进制编码一定是以比8小的数字开头的
相关文章推荐
- 中文乱码的解决之道,理清UTF8,UTF16,GB2312,Big5,Unicode之间的关系
- Unicode字符集和多字节字符集关系
- ASC码,Latin-1,Utf8,Unicode字符集编码简史
- 字符编码各种转换:utf8,unicode
- mysql设置utf8_unicode_ci字符集php页面输出??乱码的解决方法
- Unicode字符集和多字节字符集关系
- ACSII,GB2312,GBK,GB18030,Unicode,UTF8,UTF16,UTF32,BOM区别与转换——字符编码最全总结
- unicode和utf8之间的关系
- 理解字符集、字符编码、ASCII、Unicode、UTF-8
- Unicode字符集和多字节字符集关系
- ascii码 iso 8859-1 Unicode 字符编码 UTF8编码 区别 表格
- Unicode字符集和多字节字符集关系
- Unicode字符集和多字节字符集关系
- Java为什么选择unicode字符集?字符编码的那些事
- 彻底搞清楚字符编码: ASCII, ISO_8859, GB2312,UCS, Unicode, UTF8.(GBK, GB18030, BIG5, UTF-7,UTF-16,UTF-32)
- unicode和utf8之间的关系
- Unicode字符集和多字节字符集关系
- vs2010中的错误错误C2665: “AfxMessageBox”: 2 个重载中没有一个可以转换所有参数类型和Unicode字符集和多字节字符集关系
- mysql设置utf8_unicode_ci字符集php页面输出??乱码的解决方法
- 【转】对字符编码与Unicode,ISO 10646,UCS,UTF8,UTF16,GBK,GB2312的理解[holen@donews]