对各类常见字符集和字符编码格式的一些总结

3 篇文章 0 订阅

首先,需要弄清楚字符集和编码这两个概念。


字符集(character set)

字符集顾名思义是“许多字符的集合”,这些字符组成一套符号系统,可以组合起来形象的表达各种含义。比如26个英文字母加上标点符号可以组成“英文字符集”,这个字符集的组合可以形成英美人可以理解的一套文字系统。再比如新华字典中的所有汉字加上标点符号可以组成“中文字符集”,这个字符集的组合可以形成中文文字系统。

编码(encoding)

“字符编码”字面意思就是“对字符进行编码”。对字符编码的最大目的还是为了传输、储存信息(其实储存也是为了传输,是为了能传给以后的人看)。电报的传输通常使用“莫尔斯电码”。它的诞生,就是为了能用电信号传输文字。莫尔斯电码主要由点、划组成,比如“.-”表示“A”,“-…”表示“B”,可以通过发报机以脉冲电流的方式发送。发报方把文字编码,转成莫尔斯电码,接收方再解码,还原成文字。
计算机诞生以后,面临跟电报同样的问题——计算机只有电子信号0和1,字符的形状对于它来说没有任何意义,如何表示各种文字符号呢?这样就产生了各种计算机字符集和字符编码——ASCII、Unicode等。


字符集是一种传递表达的字典,而编码是一种传递字典的方式
编码步骤
  1. 确定一个字符库,这些字符足够表达想要表达的含义。
  2. 第一层编码,给每个字符定义数值
  3. 第二层编码,确定表示字符的二进制位数(8位,16位,32位等),ASCII使用7位。(定义数值的实现方式)
  4. 第三层编码,确定字符二进制值的存储格式(大端法,小端法等) 。(定义数值的存储方式)
ASCII字符集一般只有一种编码方式

当一个字符集不够用的时候,就会考虑进行扩展,进而形成一个新的字符集。而这个新的字符集,可能会使用新的数字代号,使用新的编码方式。所以,有时“字符集”和“字符编码”的概念并不严格区分。比如ASCII码,既可以指128个字符的ASCII字符集,也可以指对这128个字符的ASCII编码方法。

Unicode字符集拥有多种编码方法

Utf8、Utf16都是其编码格式(第二层编码)

一些常见场景采用的编码方法
  • java 的字符类型采用的是 Unicode 编码方案。
  • Java源码文件,*.java,可以是任意字符编码,如GBK,UTF-8。
  • Class文件,*.class,采用的是一种改进的UTF-8编码(Modified UTF-8)
  • JVM,内存中使用UTF-16编码(char 字符类)

ASCII

上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。

GB2312

又称GB0,由中国国家标准总局发布,1981年5月1日实施。ASCII编码其实只用了后7位,第1位永远是0。 它的编码范围,从00000000到01111111,都是以0开头的。
而GB2312编码,就是在ASCII编码的基础上进行扩充的,它规定了:ASCII的字符完整地包含在GB2312里,编码不变,仍然是以0开头,用一个字节来表示一个字符;对于ASCII没有的字符,就用1开头来区分,用两个字节合起来表示一个字符。
所以说,GB2312字符集使用的是ASCII扩展编码方式,ASCII标准字符集是GB2312字符集的一个子集,换句话说GB2312字符集也是ASCII标准字符集的一个扩展字符集。在中国大陆环境下,window操作系统会将启用这套字符集,安装相关更新包可以启用GB18030字符集 (ANSI字符集本来只包含了英文,后来到了各国,在ANSI字符集基础上扩展成了本地字符集,所以ANSI字符集也可以指本地字符集,ANSI字符串也表示本地字符串。比如在台湾地区,ASCII字符集就是Big5字符集)。

GBK

它是GB2312字符集的扩展集,GB2312有很多空余的位根本没有被使用,表示的汉字也只有6763个,明显不足。
GBK共收录了21003个汉字,完全兼容GB2312字符。而且GBK不像GB2312那样存在区位码与内码的区分。它的字符编码和在内码是相同的。所以GB2312的字符编码直接填到GBK编码表中即可,即完全兼容GB2312

GB18030

GB18030有两个版本:GB18030-2000和GB18030-2005。GB18030-2000是GBK的取代版本,它的主要特点是在GBK基础上增加了CJK统一汉字扩充A的汉字。GB18030-2005的主要特点是在GB18030-2000基础上增加了CJK统一汉字扩充B的汉字。所以GB18030也是兼容GB2312和GBK的。它我国继GB2312-1980和GB13000-1993之后最重要的汉字编码标准,是我国计算机系统必须遵循的基础性标准之一。

Unicode/UCS

从以上可以看到GB2312、GBK、GB18030都是ASCII字符集的扩展集。由于各个地区、国家之间都有自己的ASCII扩展字符集,而且往往是不通用的,如果跨了地区,显示就只能是乱码了。因此就出现了Unicode和UCS。本来这是两个不同的字符集,但是两个对应负责的组织都认识到必须创造一个全球统一的字符集,于是,开始合作,互相兼容,所以两者可以看作是同一个字符集。Unicode字符集最多可以容纳 1114112 个字符。编码方式包括UTF-8、UTF-16、UTF-32三种方式

UTF-8

utf-8以一个字节为单位,对unicode进行编码
UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。这是目前使用最多的Unicode字符编码格式。

Unicode编码(十六进制)UTF-8 字节流(二进制)
00000000 - 0000007F0xxxxxxx
00000080 - 000007FF110xxxxx 10xxxxxx
00000800 - 0000FFFF1110xxxx 10xxxxxx 10xxxxxx
00010000 - 001FFFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
00200000 - 03FFFFFF111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
04000000 - 7FFFFFFF1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

4个字节以内,已经包含了Unicode所有字符。
5、6个字节表示的已经是非Unicode编码范围,属于UCS-4 编码。2003年11月根据新规范,5、6字节序列在UTF-8中是不合法的。

UTF-16

UTF-16以2字节为单位,等同于UCS-2。

Unicode编码(十六进制)UTF-16 字节流(二进制)
00000000 - 0000FFFFxxxxxxxx xxxxxxxx
00010000 - 0010FFFF110110yyyyyyyyyy 110111xxxxxxxxxx

所以UTF-16通常用2、4个字节表示。

UTF-32

UTF-32编码以4字节为单位。直接把Unicode值转为4字节二进制数就是其UTF-32编码。等同于UCS-4.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值