请选择 进入手机版 | 继续访问电脑版

北南南北论坛

 找回密码
 立即注册
查看: 5|回复: 0

文字编码 ASCII 汉字GB2312 UTF-8解析

[复制链接]

213

主题

297

帖子

908

积分

高级会员

Rank: 4

积分
908
发表于 2017-12-5 16:13:02 | 显示全部楼层 |阅读模式
多媒体第一个作业是LZW编码,课件的上的一句话“文本文件和光栅图像文件的数据重复度很高,所以适合字典编码”给我印象挺深,想就此发表一下对文本文件和光栅图像文件的理解。
文本文件,我们经常看的估计也就是记事本了,也就是所谓的.txt文件。在熟悉文本文件之前,一些基本的编码东西还是要了解的,首先ASCII码,UNICODE码,UTF系列编码。ASCII,美国信息交换标准代码(America standard code of Information Interchange),用一个字节的7位,美国专用。欧洲也要编码,于是字节的8位全用上,有了IBM/ISO Latin-1。然后是第三世界国家,中国,韩国等,于是就必须得扩展了,我们中文辐射区的文字表示甚是复杂,于是两个字节的UNICODE出世。但是在几种编码的兼容问题出现了,怎样让中文的一个文件能在美国读出来呢?一种权衡方案出台--UTF系列。UTF,Universal Transformation Format,通用转换格式。UTF-8是一种非定长的字符表示方式,具体实现可以参见相关资料。
下面讨论输入码,区位码,国标码,机器码。国家标准总局1981年发布的《信息交换用汉字编码字符集--基本集》也就是著名的GB2312,是我国ASCII码。输入码,也就是我们中国人在英文键盘上的输入的码字,输入码可以有许多种,比如按拼音方式的输入码,按字型方式的输入码,甚至汉王的手写等模式识别类的输入工具都可以。输入码转变成区位码,这里涉及不同输入码的映射方式。区位码是把所有的中文字符及一些汉字中定义的一些字符等映射到一个94*94的矩阵,矩阵的行叫做区,矩阵的列叫做位。按理说汉字两个字节的编码应该有256*256种不同的编码方案,为什么最终的结果是94*94呢?ASCII码的先入为主使得汉字的编码要为一些已经存在的控制码等让步。最终确定的是94.区位码使用十进制表示的代码,1-94是会与ASCII冲突的,尤其是ASCII中的控制码(00H-1FH),空格(20H),DEL(FFH)这些都是我们在编区位码的时候极力规避的码字,所以现在还需要对区位码润色。ASCII为我们规定了上下限,我们只要在这个区间处理区位码就能与ASCII码相安无事。具体的做法是区位码先转化为16进制表示,然后每个字节加上个20H变为国标码。可见,国标码是介于21H~7EH之间,与上下限FFH,20H正好错开,至此,国标码完成。但是还是会出现一个问题,我们现在处理的这两个字节的最高位都是0,也就是说,当一个汉字编码的两个字节出现时,到底是一个汉字,还是两个ASCII码?机内码的概念出来了,把两个字节的最高位置1即可。如此,汉字编码与ASCII冲突问题完全解决。
写到这里突然产生了一个疑问,汉字编码是充分挖掘了ASCII的冗余,但是扩展的ASCII也是用了8位,怎样区别汉字与扩展ASCII?UNICDE编码,UNICDE是两个字节,如果高字节是全0,则是欧洲编码,即所谓的ASCII码和扩展ASCII码。但是使用UNICODE编码并不高效,高位的0对于英文字符来说着实浪费,于是有了UTF编码。
介绍UTF-8编码:UTF是基于前缀的一种编码。下表是维基百科上对UTF的解释。足矣。

代码范围
十六进制
标量值(scalar value)
二进制
UTF-8
二进制十六进制
注释
000000 - 00007F
128个代码
00000000 00000000 0zzzzzzz0zzzzzzz(00-7F)ASCII字符范围,字节由零开始
七个z七个z
000080 - 0007FF
1920个代码
00000000 00000yyy yyzzzzzz
110yyyyy(C0-DF) 10zzzzzz(80-BF)
第一个字节由110开始,接着的字节由10开始
三个y;二个y;六个z五个y;六个z
000800 - 00D7FF
00E000 - 00FFFF
61440个代码 [Note 1]
00000000 xxxxyyyy yyzzzzzz
1110xxxx(E0-EF) 10yyyyyy 10zzzzzz
第一个字节由1110开始,接着的字节由10开始
四个x;四个y;二个y;六个z四个x;六个y;六个z
010000 - 10FFFF
1048576个代码
000wwwxx xxxxyyyy yyzzzzzz
11110www(F0-F7) 10xxxxxx 10yyyyyy 10zzzzzz
将由11110开始,接着的字节由10开始

有了基于前缀的表示方法,那么检错就很easy了。优点不必说了,说说缺点:
缺点是不利于正则表达式的检索。维基百科上抄来的。先解释什么事正则表达式。
正则表达式貌似是个很牛逼地东西,大家小心了越陷越深。

汉字在UTF中对应的编码区域是哪一块?


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


手机版|北南南北论坛  

GMT+8, 2017-12-16 17:17 , Processed in 0.067275 second(s), 28 queries .

© 2001-2016 VxWorks6 Inc.

快速回复 返回顶部 返回列表