UTF-8编码

通常将文件分为文本文件和二进制文件。其实在物理上,它们都是二进制0或1表示的,但是逻辑划分的不同,也就是解码不同,将它们划分为这两种格式的文件。下面讲述文本文件的实质,尤其是现在非常通用的UTF-8编码。

ASCII码

计算机起源于美国,因此美国人通过将它们语言中常用的字符编码成一个个的数值,然后用二进制表示出来,就是ASCII码(American Standard Code Information Interchange)。


ASCII码都是用一个字节来表示的,且最高位都是0,所以总共可以表示128个不同的字符。从上图可以看出,从20H到7FH是可打印字符,其余是不可打印的。另外,在有些国家为表示更多字符,将最高位也加入编码范围,这样就形成扩展ASCII码,总共可表示256个字符,其中0-127与标准ASCII码相同。

Unicode编码

随着因特网的普及更多国家的字符都需要在计算机里表示,为统一起见,形成了Unicode编码。它将世界上几乎所以的字符都编码成唯一数值,这个数值成为代码点(Code Point)。但是具体如何存储并没有规定,于是有了Unicode的不同编码实现。UTF-8(8-bit Unicode Transformation Format)就是其中一种。另外还有UTF-16等。Unicode也经历了一个发展过程,分为USC-2和USC-4,为使讨论简化,可以认为Unicode涵盖了非常多的字符,包括拉丁文、希腊字母、斯拉夫文、中日韩文等等。并且用唯一的两字节数值表示(USC-2),形式如U+hhhh,每个h表示一个十六进制数,或者用四字节表示字符(USC-4)。Unicode的前128个字符与ASCII码是一致的,即,U+0000 ~ U+007F与上图ASCII表一一对应。

unicode编码表 
 U+  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F   
----------------------------------------------------- 
4e00 一 丁 丂 七 丄 丅 丆 万 丈 三 上 下 丌 不 与 丏 
4e10 丐 丑 丒 专 且 丕 世 丗 丘 丙 业 丛 东 丝 丞 丟 
4e20 丠 両 丢 丣 两 严 並 丧 丨 丩 个 丫 丬 中 丮 丯 
4e30 丰 丱 串 丳 临 丵 丶 丷 丸 丹 为 主 丼 丽 举 丿 
4e40 乀 乁 乂 乃 乄 久 乆 乇 么 义 乊 之 乌 乍 乎 乏 
4e50 乐 乑 乒 乓 乔 乕 乖 乗 乘 乙 乚 乛 乜 九 乞 也 
4e60 习 乡 乢 乣 乤 乥 书 乧 乨 乩 乪 乫 乬 乭 乮 乯 
4e70 买 乱 乲 乳 乴 乵 乶 乷 乸 乹 乺 乻 乼 乽 乾 乿 
4e80 亀 亁 亂 亃 亄 亅 了 亇 予 争 亊 事 二 亍 于 亏 
4e90 亐 云 互 亓 五 井 亖 亗 亘 亙 亚 些 亜 亝 亞 亟 
4ea0 亠 亡 亢 亣 交 亥 亦 产 亨 亩 亪 享 京 亭 亮 亯 
4eb0 亰 亱 亲 亳 亴 亵 亶 亷 亸 亹 人 亻 亼 亽 亾 亿 
4ec0 什 仁 仂 仃 仄 仅 仆 仇 仈 仉 今 介 仌 仍 从 仏 
4ed0 仐 仑 仒 仓 仔 仕 他 仗 付 仙 仚 仛 仜 仝 仞 仟 
4ee0 仠 仡 仢 代 令 以 仦 仧 仨 仩 仪 仫 们 仭 仮 仯 
4ef0 仰 仱 仲 仳 仴 仵 件 价 仸 仹 仺 任 仼 份 仾 仿 
4f00 伀 企 伂 伃 伄 伅 伆 伇 伈 伉 伊 伋 伌 伍 伎 伏 
4f10 伐 休 伒 伓 伔 伕 伖 众 优 伙 会 伛 伜 伝 伞 伟 
4f20 传 伡 伢 伣 伤 伥 伦 伧 伨 伩 伪 伫 伬 伭 伮 伯 

UTF-8实现

说过了,Unicode只是编码规范,对于字符如何存储,也就是编码的实现方式并没有规定。Unicode Transformation Format表明UTF-8是Unicode的转换方式,还有其他实现方式,如UTF-16、UFT-32等,但都不常用,所以不是本文的介绍重点。

UTF-8最大的特点是用变长字节表示不同的字符,从一个字节到四个字节。它的编码实现规则也比较简单:

1)对单字节的字符,其高位为0,其余7为表示字节码,与ASCII码相同,所以UTF-8兼容ASCII码;

2)对n字节表示的字符,其第一个字节的前n个bit都是1,且接下来的一位是0,后面n-1个字节的首两位分别为10。余下的(4 + (n - 1) * (8 - 2))位表示Unicode码。

    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

上面表格表明Unicode的UTF-8实现时,对应的字节数和相应的实现规则。

举例:

如果在文件中输入字符“a一”,一个英文字母和一个汉字,保存的格式是UTF-8,那么看看存储的到底是什么。先猜测结果,然后通过工具验证。如果验证正确,说明我们之前的推理是对的,那么我们对UTF-8编码实现规则的理解就是正确的。a是英文字母,ASCII码值为61H,它的Unicode代码点为:U+00000061,通过上表看出是单字节字符,UTF-8编码是61H,与ASCII码完全相同。汉字“一”,通过查找汉字Unicode编码知,它的代码点是U+00004e00,上表可以得知它是三字节字符,第一字节的前三位是1,接着是0,后两字节的首两位分别是10,剩下的16位填上4e00,高位填充0,所以是1110 0100| 10 111000| 10 000000,e4b880H。加上前面的字母“a”,总的结果是61e4b880H.

验证:

UltraEdit软件具有十六进制查看功能,输入“a一”,选择保存的格式为“UTF-8 - 无BOM”。那么文件就是UTF格式存储的,打开时默认是按字符格式打开。这时编辑器读取文件的内容,然后解码,显示字符,跟输入的结果一样。点击“切换十六进制模式”后,看到的是文件的十六进制内容,显示“61e4b880”正是我们之前测试的结果。

BOM(Byte Order Mark)字节序符号

UTF-8不需要字节序就可以判断出对应的Unicode代码点。而对于UTF-16,不同实现方式,对大端小端策略不同。在windows上默认的UTF-8会在文件前面加上BOM标志:EF BB BF,以上面例子结果就是EF BB BF E4 B8 80。如果存储格式为“UTF-8 - 无BOM”,那么文件前面就没有BOM标志。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值