`
m635674608
  • 浏览: 5061356 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

各种编码格式的区别与联系

    博客分类:
  • java
 
阅读更多

字符编码、内码,汉字编码

字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ASCII编码,为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5。

GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。

GB2312 支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。2000年的 GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。现在的PC平 台必须支持GB18030,对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。

从ASCII、 GB2312、GBK到GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码 中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼,GB2312、GBK到GB18030都属于双字节字符集 (DBCS)。

有的中文Windows的缺省内码还是GBK,可以通过GB18030升级包升级到GB18030。不过GB18030相对GBK增加的字符,普通人是很难用到的,通常我们还是用GBK指代中文Windows内码。

这里还有一些细节:

  • GB2312的原文还是区位码,从区位码到内码,需要在高字节和低字节上分别加上A0。

  • 在DBCS中,GB内码的存储格式始终是big endian,即高位在前。

  • GB2312 的两个字节的最高位都是1。但符合这个条件的码位只有128*128=16384个。所以GBK和GB18030的低字节最高位都可能不是1。不过这不影 响DBCS字符流的解析:在读取DBCS字符流时,只要遇到高位为1的字节,就可以将下两个字节作为一个双字节编码,而不用管低字节的高位是什么。

2、Unicode、UCS和UTF

前面提到从ASCII、GB2312、GBK到GB18030的编码方法是向下兼容的。而Unicode只与ASCII兼容(更准确地说,是与ISO-8859-1兼容),与GB码不兼容。例如“汉”字的Unicode编码是6C49,而GB码是BABA。

Unicode 也是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方案。Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode Character Set"的缩写。

根据维基百科全书(http: //zh.wikipedia.org/wiki/)的记载:历史上存在两个试图独立设计Unicode的组织,即国际标准化组织(ISO)和一个软件制 造商的协会(unicode.org)。ISO开发了ISO 10646项目,Unicode协会开发了Unicode项目。

在1991年前后,双方都认识到世界不需要两个不兼容的字符集。于是它们开始合并双方的工作成果,并为创立一个单一编码表而协同工作。从Unicode2.0开始,Unicode项目采用了与ISO 10646-1相同的字库和字码。

目前两个项目仍都存在,并独立地公布各自的标准。Unicode协会现在的最新版本是2005年的Unicode 4.1.0。ISO的最新标准是10646-3:2003。

UCS规定了怎么用多个字节表示各种文字。怎样传输这些编码,是由UTF(UCS Transformation Format)规范规定的,常见的UTF规范包括UTF-8、UTF-7、UTF-16。

IETF 的RFC2781和RFC3629以RFC的一贯风格,清晰、明快又不失严谨地描述了UTF-16和UTF-8的编码方法。我总是记不得IETF是 Internet Engineering Task Force的缩写。但IETF负责维护的RFC是Internet上一切规范的基础。

3、UCS-2、UCS-4、BMP

UCS有两种格式:UCS-2和UCS-4。顾名思义,UCS-2就是用两个字节编码,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码。下面让我们做一些简单的数学游戏:

UCS-2有2^16=65536个码位,UCS-4有2^31=2147483648个码位。

UCS -4根据最高位为0的最高字节分成2^7=128个group。每个group再根据次高字节分为256个plane。每个plane根据第3个字节分为 256行 (rows),每行包含256个cells。当然同一行的cells只是最后一个字节不同,其余都相同。

group 0的plane 0被称作Basic Multilingual Plane, 即BMP。或者说UCS-4中,高两个字节为0的码位被称作BMP。

将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。在UCS-2的两个字节前加上两个零字节,就得到了UCS-4的BMP。而目前的UCS-4规范中还没有任何字符被分配在BMP之外。

4、UTF编码

UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:

UCS-2编码(16进制) UTF-8 字节流(二进制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

读者可以用记事本测试一下我们的编码是否正确。

UTF -16以16位为单元对UCS进行编码。对于小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于 0x10000的UCS码,定义了一个算法。不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为UTF -16和UCS-2基本相同。但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。

5、UTF的字节序和BOM

UTF -8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如收 到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是 “乙”?

Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法:

在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输 字符"ZERO WIDTH NO-BREAK SPACE"。

这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

UTF -8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF(读者可以用我们前面介绍的编码方法验证一下)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

Windows就是使用BOM来标记文本文件的编码方式的。

 

http://blog.chinaunix.net/uid-1849361-id-2825418.html

分享到:
评论

相关推荐

    干货:数字音频技术中PDM PCM I2S TDM编码格式与接口解析

    文中不仅详细讲解了这些技术的工作原理和相关时序图,还解释了它们之间的区别与联系。 适合人群:对于音频技术感兴趣的初学者或者从事嵌入式系统设计的专业人士。 使用场景及目标:①希望深入理解不同数字音频格式和...

    gb2312_unicode_utf8汉字编码对照表

    通过对gb2312、Unicode与UTF-8编码对照表的分析,我们可以了解到这三种编码方式之间的联系与区别。gb2312作为早期的汉字编码标准,虽然简单但覆盖范围有限;Unicode则提供了一个更为广泛的字符集,支持全球多种语言...

    Python文本模式匹配与TXT文件编码类型的识别.pdf

    BOM是一个可选的、用来标识文件所使用的Unicode编码格式的标记,例如UTF-8、UTF-16等。一些编码,如UTF-8,根据规范可以不带有BOM,而ANSI编码通常也不会带有BOM,这使得在没有BOM的情况下区分UTF-8和ANSI编码成为一...

    模拟电路与数字电路的区别和联系

    模拟电路与数字电路是电子工程领域中两个基础且重要的分支,它们在很多方面都存在明显的区别,但同样在某些深层次上保持着紧密的联系。首先我们要明确的是,无论是模拟电路还是数字电路,它们都是基于电子学原理,用...

    海德汉绝对式旋转编码器的最优化扫描方式技术信息.pdf

    信号解码的方式通常包含了二进制码、格雷码或其它编码格式。 6. 接口和通讯协议:编码器与控制系统之间的连接往往涉及到特定的接口类型,如串行接口(例如RS422)和数字接口(例如SSI、EnDat),它们允许编码器与...

    基带调制和射频调制概念和区别

    这种处理通常包括对信号的编码和格式化,使其更适合于特定类型的传输通道。 ##### 2. 特点 - **直接性**:基带信号通常直接表示原始信息,没有额外的频率变换。 - **简单性**:基带信号的处理相对简单,因为它是在...

    c语言编码规范.pptx

    - **提高可读性**:良好的代码格式让程序易于阅读。 - **易于理解**:易读的代码便于理解其逻辑结构。 - **健康代码**:易于理解的代码更健壮稳定。 - **展示专业水平**:编程风格反映了程序员对编程语言的理解程度...

    ASCII Unicode 和UTF-8区别

    而UTF-8作为Unicode的一种实现方式,弥补了Unicode在存储方面的问题,并且由于它的变长特性和对ASCII的兼容性,成为了互联网时代最常用的编码格式。了解这三者的区别,对于在多语言、多字符集环境下开发和处理文本...

    NFC vs ISO14443 vs Felica之间的联系及区别.pdf

    标题与描述均提到了“NFC vs ISO14443 vs Felica之间的联系及区别”,这表明文档主要探讨了近场通信(NFC)、ISO14443标准以及索尼开发的Felica技术三者之间的关系与差异。以下是根据给定的信息详细解析这些知识点。...

    C#和Java有什么区别和联系

    【C#和Java之间的区别与联系】 C#和Java是两种广泛应用的面向对象的编程语言,它们在设计目的、语法、平台支持以及生态系统等方面存在差异,同时也有一些相似之处。这里我们将探讨它们的主要区别和联系,特别是在...

    char TCHAR WCHAR区别

    ### char、TCHAR、WCHAR 的区别与应用 在C/C++编程中,尤其是在Windows平台上的开发中,正确...理解它们之间的区别和联系,以及如何在Unicode和非Unicode环境中合理使用,是每个Windows平台开发者必须掌握的基本技能。

    Excel中文件格式互转-CSV转XLS教程

    由于其简洁性,这种格式可以在各种软件之间轻松导入和导出,包括电子邮件客户端、数据库管理系统和数据分析工具。CSV文件通常使用".csv"扩展名。 2. XLS文件详解: XLS是Microsoft Excel早期版本(97-2003)使用的...

    通信、接口、网络、协议、总线的区别和联系.ppt

    了解它们之间的区别与联系,不仅有助于我们更好地使用现代技术,还能够帮助我们在面临复杂的工业自动化和计算机网络问题时,更加精准地找到问题根源并加以解决。在实际应用中,正确选择和配置接口、网络、协议和总线...

    python3中的eval和exec的区别与联系

    看了很多网上的方法,写入文件后打开文件看确实不再是乱码,但是从文件中读入json时发现了乱码,可能是读文件默认的编码格式不对。下面读写方法可行。 注意,ensure_ascii=False可以保证不会以ascii格式编码,保证...

    ffmpeg动态库、静态库,64位windows版

    FFmpeg内建了大量的音视频编解码器,如H.264、H.265(HEVC)、AAC等,可以处理各种编码格式的媒体内容。 8. **联系作者获取更多需求** 如果有除MP4、AVI、MOV之外的文件格式需求或其他特定功能要求,可以通过提供...

    简单了解Python3 bytes和str类型的区别和联系

    比如,如果尝试用字节流来处理字符串数据,可能会因为编码格式不匹配而导致数据无法正确解读,反之亦然。 在Python的交互式环境中,可以看到bytes和str类型的表示形式。str类型通常以普通字符串形式显示,而bytes...

    数字图像处理第三版所有图片,已转化成24为bmp格式

    《数字图像处理第三版》是一本深入探讨图像处理理论与实践的专业书籍,其所有图片已转化为24位真彩色BMP格式,便于读者理解和学习。这些图像分别按章节进行整理,方便用户根据需要快速定位到相关知识点。以下是针对...

Global site tag (gtag.js) - Google Analytics