`
fantasy
  • 浏览: 513840 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java中的字符集编码入门(一)Unicode与UCS的历史恩怨

阅读更多
按:这是早前发表在我个人其他博客上的文章,现在根据文本分类和网页设计的需要进行重新的汇编和整理,也加入了一些新东西,希望对感兴趣的人有所帮助。

ASCII及相关标准
地球人都知道ASCII就是美国标准信息交换码的缩写,也知道ASCII规定用7位二进制数字来表示英文字符,ASCII被定为国际标准之后的代号为ISO-646。由于ASCII码只使用了7个二进制位,也就是说一个字节可以表示的256个数字中,它仅使用了0~127这128个码位,剩下的128个码位便可以用来做扩展,用来表示一些特定语言所独有的字符,因此对这多余的128个码位的不同扩展,就形成了一系列ISO-8859-*的标准。例如为英语作了专门扩展的字符集编码标准编号为ISO-8859-1,也叫做Latin-1,为希腊语所作的扩展编号为ISO-8859-7等,完整的列表可以参考《Java Internationalization》一书。

Unicode与UCS
整个Unicode项目是由多家计算机软件公司,还包括一些出版行业的公司共同发起的,从上世纪八十年代就已经开始。地球人都知道,对于日文,汉字来说,256个码位是远远不够用的(当然,在当时并不是地球人都知道,起码设计计算机的老美们就不知道,甚至直到今天,还有老美以为米国是世界上唯一的国家)。解决方法很直观也很明显,那就是采用码位多到足够包含所需字符数量的编码方案(即俗话说的头痛医头,脚痛医脚嘛)。这也是Unicode的目标之一,能够包含世界上所有语言的字符(包括汉字,日文,数学符号,音乐符号,还包括各种奇奇怪怪看也看不懂的东西比如象形文字,甲骨文 ,三个代表,科学发展观等等,笑),这个理想,可以说很远大,但很快被发现仅靠Unicode原先的设计无法实现。Unicode的另一个设计目标,对今天影响深远,那就是对所有字符都采用16位编码(即用一个大小不超过2的16次方的整数数字给每个字符编号,注意从这个意义上也可以看出,Unicode是一种编码字符集,而非字符集编码)。说这个设计目标对现今影响深远,完全不是表扬,因为到后来连Unicode的设计者也发现,16位编码仅有65536个码位,远远不能容纳世界上所有的字符,但当意识到这个问题的时候,Unicode大部分的规范已经制定完毕,也有相当程度的普及,完全推倒重来是不现实的。这成了一个遗留问题,也是surrogate pair这种蹩脚解决方案的发端。

无独有偶,在1984年,喜欢以繁多的编号糊弄群众的国际标准化组织ISO也开始着手制定解决不同语言字符数量太大问题的解决方案,这一方案被称为Universal Character Set(UCS),正式的编号是ISO-10646(记得么,ASCII是ISO-646,不知这种安排是否是故意的)。还是ISO高瞻远瞩,一开始就确定了UCS是一个31位的编码字符集(即用一个大小不超过2的31次方的整数数字为每个字符编号),这回真的足以容纳古往今来所有国家,所有语言所包含的字符了(是的,任何国家,任何小语种都包括,也不管这些国家是与台湾建交还是与中国大陆建交,是拥护民主制度还是实行恐怖主义,所以说科学无国界)。虽然后来他们意识到,2的31次方个码位又实在太多了……

天下大势,分久必合。无论Unicode还是UCS,最初的目的都是杜绝各种各样名目繁多形式各异互不兼容老死不相往来的私用扩展编码(好啰嗦的一句话),结果两方确立标准的同时(最初时这两个标准是不兼容的),又形成了割据,这对建设和谐社会是不利的,违反当今世界和平与发展的主旋律,中国政府一向反对任何形式的霸权主义和强权政治,对以米国为首的发达国家……扯远了扯远了。1991年,Unicode联盟与ISO的工作组终于开始讨论Unicode与UCS的合并问题,虽然其后的合并进行了很多年,Unicode初版规范中的很多编码都需要被改写,UCS也需要对码空间的使用进行必要限制,但成果是喜人的。最终,两者统一了抽象字符集(即任何一个在Unicode中存在的字符,在UCS中也存在),且最靠前的65535个字符也统一了字符的编码。对于码空间,两者同意以一百一十万为限(即两者都认为虽然65536不够,但2的31次方又太大,一百一十万是个双方都可接受的码空间大小,也够用,当然,这里说的一百一十万只是个约数),Unicode将码空间扩展到了一百一十万,而UCS将永久性的不使用一百一十万以后的码位。也就是说,现在再讲Unicode只包含65536个字符是不对的。除了对已经定义的字符进行统一外,Unicode联盟与ISO工作组也同意今后任何的扩展工作两者均保持同步,因此虽然从历史的意义上讲Unicode与UCS不是一回事(甚至细节上说也不是一回事),但现在提起Unicode,指代两者均无不妥。
分享到:
评论

相关推荐

    Java中的字符集编码入门(二)编码字符集与字符集编码的区别[参考].pdf

    编码字符集,如UCS(Universal Character Set)或Unicode,是一个抽象的概念,它定义了一套字符的集合,包括世界上各种语言的字母、数字和符号。这些字符没有特定的顺序,而是通过人为的方式组织起来。Unicode是当前...

    Java中的字符集编码入门(清晰书签版)[借鉴].pdf

    本文主要探讨了字符编码的历史发展,特别是ASCII、Unicode和UCS的关系及其在Java中的应用。 ASCII,即美国标准信息交换码,是最早广泛使用的字符编码标准,使用7位二进制表示128个字符,主要覆盖英文字符。随着全球...

    Java Unicode 和字符集

    ### Java中的Unicode与字符集详解 #### 一、引言 在软件开发过程中,正确处理文本数据至关重要。尤其是在全球化日益加深的今天,软件不仅要能够处理英语等常见的西方语言,还要支持世界各地的语言,包括中文、日文...

    java字符集编码问题

    本文旨在深入探讨与Java相关的字符集编码知识,包括但不限于编码的基本概念、几种常见的字符集编码类型及其特点,以及Java如何处理这些字符集编码问题。 #### 二、编码基本知识 1. **ISO 8859-1** ISO 8859-1是...

    嵌入式字符编码(经典)(ucs2,+unicode,+utf8,+gb2312)[借鉴].pdf

    本文主要围绕四个重要的字符编码体系展开:ASCII、Unicode(UCS)、UTF-8以及GB2312,这些都是在软件网络技术中广泛使用的编码格式。 1. ASCII(American Standard Code for Information Interchange):ASCII是最...

    unicode/UCS/UTF-8/Base64/ANSI等编码介绍

    总结来说,Unicode和UCS为全球字符的统一编码提供了基础,UTF-8作为Unicode的一种实现,已经成为互联网上最常用的字符编码。Base64则在数据传输和存储中发挥着重要作用,而ANSI编码则在特定环境下处理西方语言的文本...

    字符编码(ucs2, unicode, utf8, gb2312)

    Unicode 是基于 UCS 的一个字符编码标准,旨在创建一个通用的字符集,使得所有语言和文字可以在计算机中表示和存储。Unicode 使用 16 位或 32 位的二进制代码,能够表示超过 100 万个字符。 UTF-8 UTF-8(Unicode ...

    Java中字符集的详细介绍

    Java中的字符集是一个重要的概念,尤其对于处理多语言文本或者跨平台的数据交换至关重要。Java语言内部使用Unicode编码,具体来说是UTF-16格式,这意味着每个`char`类型变量能够表示一个Unicode字符,通常占据两个...

    Linux字符集编码转换.docx

    Linux 字符集编码转换是一个非常重要的概念,在 Linux 操作系统中,字符集编码转换是必备的知识。本文将从基础概念开始,逐步引导读者了解字符集编码转换的相关知识。 首先,让我们了解什么是 ASCII 编码。ASCII ...

    关于JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

    Unicode是一种国际标准字符集,它为每一个字符分配了一个唯一的数字,解决了传统编码中字符不统一的问题。Unicode编码分为多种类型,如UCS-2、UCS-4等,其中UCS-2是最常用的,它使用两个字节来表示一个字符。在Java...

    字符集和字符编码

    GB2312 是中国大陆规定的字符集和编码,取消了 EASCII 的扩展字符,规定一个小于 127 的字符的意义与原来相同,但两个大于 127 的字符连在一起时,就表示一个汉字。GB2312 编码使用两个字节表示一个汉字,前面的一个...

    C语言字符编码转换UNICODE、GBK、UTF-8互相转换

    GBK编码使用两个字节来表示一个字符,与UNICODE相比,它不是全球通用的,主要用于中文环境。 UTF-8是一种变长的编码方式,它可以使用1到4个字节来表示一个字符。对于ASCII字符,UTF-8使用单个字节,而对于其他...

    深入Java 中的字符集

    本文将基于提供的标题、描述、标签及部分内容,详细阐述Java中的字符集相关知识,特别是针对Unicode及其编码方式的理解。 #### 一、ASCII与扩展标准 ASCII(American Standard Code for Information Interchange)...

    ASCII码及UCS2编码转换器,包含中文编解码

    UCS2编码每个字符占用两个字节,对于大部分现代Unicode字符集来说,这已经足够了。然而,对于超出16位范围的Unicode字符,UCS2则无法表示,这时候就需要使用UTF-16或UTF-8等扩展编码。 C#编程语言提供了强大的字符...

    字符集和字符编码相关知识文档

    本文档主要介绍了几种常见的字符集和字符编码,包括ASCII、DBCS、GB2312、GBK、GB18030、BIG5以及UCS和Unicode。 1. ASCII字符集和编码: ASCII(美国信息交换标准代码)是最基础的字符编码,它包含了7位的字符编码...

    Unicode字符集

    Unicode字符集,全称为“统一码”或“万国码”,是计算机领域中广泛采用的一种字符编码标准。它的设计目标是为全球各种语言的每一个字符提供一个唯一且统一的二进制表示,以便于跨语言、跨平台的文本处理。Unicode自...

    GB2312,UTF8,UCS2汉字编码生成与转换工具

    UCS2,即Unicode字符集的16位编码形式,属于Unicode标准的一部分。每个字符用两个字节来表示,理论上能表示65536个不同的字符。UCS2简洁明了,但无法涵盖Unicode的全部扩展,因此在处理包含大量辅助平面字符(如表情...

    短信UCS编码或解码工具

    UCS(Universal Character Set,通用字符集)是一种广泛使用的字符编码标准,它包含了全世界大部分语言的字符。UCS编码在短信领域的应用主要是通过其子集UCS2,这是一种16位的编码方式,能够表示大量的Unicode字符。...

    字符编码大全gbk utf8 ucs

    而UTF8是Unicode的一种实现方式,能够表示Unicode中的所有字符,包括全球各种语言,且在ASCII字符上与ASCII相同,便于兼容。 Unicode是一个通用的字符集,旨在涵盖世界上几乎所有的书写系统。UCS(Universal ...

Global site tag (gtag.js) - Google Analytics