Java 字符编码讲解

java字符编码种类

  1. ASCII(American Standard Code for Information Interchange)
  2. ANSI(American National Standard Institite )
  3. MBCS(Multi-Byte Chactacter System(Set))
  4. CodePage
  5. Unicode(Universal Code)

ASCII(American Standard Code for Information Interchange)

美国信息交换标准代码,这是计算机上最早使用的通用的编码方案。那个时候计算机还只是拉丁文字的专利,根本没有想到现在计算机的发展势头,如果想到了,可能一开始就会使用 unicode 了。当时绝大部分专家都认为,要用计算机,必须熟练掌握英文。这种编码占用 7 个 Bit,在计算机中占用一个字节,8 位,最高位没用,通讯的时候有时用作奇偶校验位。因此 ASCII 编码的取值范围实际上是:0x00-0x7f,只能表示 128 个字符。后来发现 128 个不太够用,做了扩展,叫做 ASCII 扩展编码,用足八位,取值范围变成:0x00-0xff,能表示 256 个字符。其实这种扩展意义不大,因为 256 个字符表示一些非拉丁文字远远不够,但是表示拉丁文字,又用不完。所以扩展的意义还是为了下面的 ANSI 编码服务。

ANSI(American National Standard Institite )

美国国家标准协会,也就是说,每个国家(非拉丁语系国家)自己制定自己的文字的编码规则,并得到了 ANSI 认可,符合 ANSI 的标准,全世界在表示对应国家文字的时候都通用这种编码就叫 ANSI 编码。换句话说,中国的 ANSI 编码和在日本的 ANSI 的意思是不一样的,因为都代表自己国家的文字编码标准。比如中国的 ANSI 对应就是 GB2312 标准,日本就是 JIT 标准,香港,台湾对应的是 BIG5 标准等等。当然这个问题也比较复杂,微软从 95 开始,用就是自己搞的一个标准 GBK。GB2312 里面只有 6763 个汉字,682 个符号,所以确实有时候不是很够用。GBK 一直能和 GB2312 相互混淆并且相安无事的一个重要原因是 GBK 全面兼容 GB2312,所以没有出现任何冲突,你用 GB2312 编码的文件通过 GBK 去解释一定能获得相同的显示效果,换句话说:GBK 对 GB2312 就是,你有的,我也有,你没得的,我还有!

好了,ANSI 的标准是什么呢,首先是 ASCII 的代码你不能用!也就是说 ASCII 码在任何 ANSI 中应该都是相同的。其他的,你们自己扩展。所以呢,中国人就把 ASCII 码变成 8 位,0x7f 之前我不动你的,我从 0xa0 开始编,0xa0 到 0xff 才 95 个码位,对于中国字那简直是杯水车薪,因此,就用两个字节吧,此编码范围就从 0xA1A1 - 0xFEFE,这个范围可以表示 23901 个汉字。基本够用了吧,GB2312 才 7000 多个呢!GBK 更猛,编码范围是从 0x8140 - 0xFEFE,可以表示 3 万多个汉字。可以看出,这两种方案,都能保证汉字头一个字节在 0x7f 以上,从而和 ASCII 不会发生冲突。能够实现英文和汉字同时显示。

BIG5,香港和台湾用的比较多,繁体,范围: 0xA140-0xF9FE,0xA1A1-0xF9FE,每个字由两个字节组成,其第一字节编码范围为 0xA1-0xF9,第二字节编码范围为 0x40-0x7E 与 0xA1-0xFE,总计收入 13868 个字 (包括 5401个 常用字、7652 个次常用字、7 个扩充字、以及 808 个各式符号)。

那么到底 ANSI 是多少位呢?这个不一定!比如在 GB2312 和 GBK,BIG5 中,是两位!但是其他标准或者其他语言如果不够用,就完全可能不止两位!

例如:GB18030: GB18030-2000(GBK2K)在 GBK 的基础上进一步扩展了汉字,增加了藏、蒙等少数民族的字形。GBK2K 从根本上解决了字位不够,字形不足的问题。它有几个特点:它并没有确定所有的字形,只是规定了编码范围,留待以后扩充。编码是变长的,其二字节部分与 GBK 兼容;四字节部分是扩充的字形、字位,其编码范围是首字节 0x81-0xfe、二字节 0x30-0x39、三字节 0x81-0xfe、四字节 0x30-0x39。它的推广是分阶段的,首先要求实现的是能够完全映射到 Unicode3.0 标准的所有字形。它是国家标准,是强制性的。

搞懂了 ANSI 的含义,我们发现 ANSI 有个致命的缺陷,就是每个标准是各自为阵的,不保证能兼容。换句话说,要同时显示中文和日本文或者阿拉伯文,就完全可能会出现一个编码两个字符集里面都有对应,不知道该显示哪一个的问题,也就是编码重叠的问题。显然这样的方案不好,所以 Unicode 才会出现!

MBCS(Multi-Byte Chactacter System(Set))

多字节字符系统或者字符集,基于 ANSI 编码的原理上,对一个字符的表示实际上无法确定他需要占用几个字节的,只能从编码本身来区分和解释。因此计算机在存储的时候,就是采用多字节存储的形式。也就是你需要几个字节我给你放几个字节,比如 A 我给你放一个字节,比如"中“,我就给你放两个字节,这样的字符表示形式就是 MBCS。

在基于 GBK 的 windows 中,不会超过 2 个字节,所以 windows 这种表示形式有叫做 DBCS(Double-Byte Chactacter System),其实算是 MBCS 的一个特例。C 语言默认存放字符串就是用的 MBCS 格式。从原理上来说,这样是非常经济的一种方式。

CodePage

代码页,最早来自 IBM,后来被微软,oracle,SAP 等广泛采用。因为 ANSI 编码每个国家都不统一,不兼容,可能导致冲突,所以一个系统在处理文字的时候,必须要告诉计算机你的 ANSI 是哪个国家和地区的标准,这种国家和标准的代号(其实就是字符编码格式的代号),微软称为 Codepage 代码页,其实这个代码页和字符集编码的意思是一样的。告诉你代码页,本质就是告诉了你编码格式。

但是不同厂家的代码页可能是完全不同,哪怕是同样的编码,比如, UTF-8 字符编码 在 IBM 对应的代码页是 1208,在微软对应的是 65001,在德国的 SAP 公司对应的是 4110 。所以啊,其实本来就是一个东西,大家各自为政,搞那么多新名词,实在没必要!所以标准还是很重要的!!!

比如 GBK 的在微软的代码页是 936,告诉你代码页是 936 其实和告诉你我编码格式是 GBK 效果完全相同。那么处理文本的时候就不会有问题,不会去考虑某个代码是显示的韩文还是中文,同样,日文和韩文的代码页就和中文不同,这样就可以避免编码冲突导致计算机不知如何处理的问题。当然用这个也可以很容易的切换语言版本。但是这都是治标不治本的方法,还是无法解决同时显示多种语言的问题,所以最后还是都用 unicode 吧,永远不会有冲突了。

Unicode(Universal Code)

这是一个编码方案,说白了就是一张包含全世界所有文字的一个编码表,只要这个世界上存在的文字符号,统统给你一个唯一的编码,这样就不可能有任何冲突了。不管你要同时显示任何文字,都没有问题。因此在这样的方案下,Unicode 出现了。Unicode 编码范围是:0-0x10FFFF,可以容纳 1114112 个字符,100 多万啊。全世界的字符根本用不完了,Unicode 5.0 版本中,才用了 238605 个码位。所以足够了。

因此从码位范围看,严格的 unicode 需要 3 个字节来存储。但是考虑到理解性和计算机处理的方便性,理论上还是用 4 个字节来描述。

Unicode 采用的汉字相关编码用的是《CJK 统一汉字编码字符集》— 国家标准 GB13000.1 是完全等同于国际标准《通用多八位编码字符集 (UCS)》 ISO 10646.1。《GB13000.1》中最重要的也经常被采用的是其双字节形式的基本多文种平面。在这 65536 个码位的空间中,定义了几乎所有国家或地区的语言文字和符号。其中从 0x4E00-0x9FA5 的连续区域包含了 20902 个来自中国(包括台湾)、日本、韩国的汉字,称为 CJK (Chinese Japanese Korean) 汉字。CJK 是 《GB2312-80》、《BIG5》 等字符集的超集。

CJK 包含了中国,日本,韩国,越南,香港,也就是 CJKVH。这个在 UNICODE 的 Charset chart 中可以明显看到。 unicode 的相关标准可以从 https://www.unicode.org/standard/standard.html 上面获得。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值