欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深入解析字符编码原理与应用

时间:11-23 名人轶事 提交错误
当计算机刚出现的时候,计算机诞生地美国的一群人,将所有的英文和相应的标点符号、空格、数字等编码成1个字节的后7位数字。即一个字节的0-127种状态,范围从0000 0000到0111 1111。这样,当计算机读取到相应的二进制值时,就可以将其解析成相应的符号,然后进行后续操作。这种编码方法称为ASCII 编码,因此ASCII 码的编码形式为0 XXX XXXX。 该字节的第一位有时称为偶校验位,加上二进制编码的其余7 位,正好是一个字节。 ASCII码规定8个二进制位中的最高位为0,其余7位可以给出128个代码,代表128个不同的字符。其中,95个代码对应计算机终端可以键入并显示的95个字符,如26个大小写英文字母、数字和标点符号等;其余33个字符的代码值为0~31和127,它们用作控制代码,控制计算机设备和软件的一些操作。 最开始,计算机只在美国使用,所以大家用ASCII码来处理英语是没有问题的。后来随着计算机的普及,越来越多的国家开始使用计算机,而每个国家的语言也不尽相同。这就产生了一个问题。对于一些国家来说,常规的ASCII码表示的128个字符是不够的,因此衍生出了ISO-8859-1、GB2312等编码。
2. ISO-8859-1
其中,不能满足上述ASCII码的国家包括一些欧洲国家,因此这些欧洲国家决定: 将你使用的语言编码成原始字节中第一个未使用的第一个字节,范围从1000 0000到1111 1111。这样的话,这个编码系统可以表示256个符号,其中0到127个ASCII码表示的符号是同样,128到255分别代表各自国家使用的符号。其中包括西欧国家的ISO-8859-1、中欧的ISO-8859-2、南欧的ISO-8859-3、北欧的ISO-8859-4 以及阿拉伯国家相应的ISO-8859-1,希腊等相关国家。 8859-X系列,其中ISO-8859-1又称为Latin-1,ISO-8859-2又称为Latin-2等。对应ISO-8859系列的详细说明请参考维基百科:Wikipedia- ISO/IEC 8859 详细介绍
3. GB2312
我们把注意力转回中国。当20世纪末计算机开始在中国普及时,我们也遇到了同样的问题。由于中华文化博大精深,汉字的发展历史悠久,应用广泛。汉字有几千多个。显然,即使使用ASCII码的第一位,也不能保存多少汉字。因此,国内开发者开发了一种新的编码方式,不过我们先来看看位置码。
3.1 区位码
   在GB2312编码中,汉字是“分区”的,从01区到94区编号;每个区域包含94个字符,编号从01到94。这种表示方法也称为区位码。每个字符由其唯一对应的区号和位数确定。位置代码一般用十进制表示,其中: 01-09区域为符号和数字; 16-55区为一级汉字,约3755个,按汉语拼音字母/笔画顺序排列; 56-87区为二级汉字,约3008个,按部首/笔画排列;区域10-15 和88-94 中没有使用空格;例如字符“啊”是16区的第一个字符,其区号是1601;字符“chen”是72区的第41个字符,它的区位码是7241。那么我们来看看具体的编码方法。
3.2 GB2312编码
首先,1到127一个字节内的符号保持不变,与ASCII码一致;然后用一个字节与前一个字节连接,一个汉字由两个字节表示,其中第一个字节称为高位字节,第二个字节称为低位字节;高位字节=区域代码+0xA0 低位字节=位编号+0xA0。例如:“啊”的区号是1601, 高字节=0x10 (=16) +0xA0=0xB0

低字节=0x01 (=1) +0xA0=0xA1 因此,“ah”的编码为0xB0(第一编码单元)和0xA1(第二编码单元),所以最终的编码为B0A1。 不过,需要简单说明的是: 高位字节编码为0xA1~0xF7(01~87区的区号加0xA0),低位字节编码为0xA1~0xFE(0xA0加01~94)。这样,我们就可以组合出7000多个简体字了。汉字。在这些代码中,我们还包括数学符号、罗马和希腊字母以及日语假名。就连原本存在于ASCII中的数字、标点符号、字母都被重新编码成了两个字节长的代码。通常被称为“全角”字符,而那些最初尺寸低于127 的字符被称为“半角”字符。编码完成后,无论是高位字节还是低位字节,它们的最高位都是1,这样就可以和ASCII字符的编码区分开来。因此,GB2312是ASCII码的中文扩展。另外,区位码可以理解为字符集,GB2312可以看成是支持该字符集的编码。这其实有点类似于我们后面要讲的Unicode和UTF-8的关系。
4. GBK,Big5,GB18030
GB2312虽然包含了常用的简体中文,但汉字数量太多,其中包括一些生僻字和不常用的繁体字,因此GBK诞生了。 GBK以GB2312为基础,收录了生僻字、繁体中文、日文、韩文汉字,以及GB2312中未收录的中文部首符号、竖排标点符号,形成GBK编码。 GBK的整体编码范围是0x8140到0xFEFE,高位字节范围是0x81-0xFE,低位字节范围是0x40-7E和0x80-0xFE,其中低位字节不包括0x7F。Big5:至于Big5,被认为与GB2312同一时期。是台湾、香港等地流行的以繁体中文为主的双字节字符集。它还使用两个字节。第一个字节称为高字节字符。第二个字节称为低字节,高字节范围为0x81-0xFE,低字节范围为0x40-0x7E和0xA1-0xFE。了解更多关于Big5的信息,请参考:维基百科-Big5(Big5)GB18030:GB18030在GBK的基础上,新增了少数民族字符和GBK不支持的字符。 GBK和GB2312都是双字节编码,而GB18030是变长字节编码。变长字节编码包括单字节、双字节和四字节方法: GB18030的单字节编码范围是0x00-0x7F,与ASCII码完全一致;而双字节编码范围与GBK相同,高字节为0x81-0xFE,低字节编码范围为0x40-0x7E和0x80-0xFE;四字节编码中第一、第三字节的编码范围为0x81-0xFE,第二、第四字节的编码范围为0x30-0x39。
5. Unicode
 由于每个国家都有自己的编码标准,就像当时的中国一样,没有人理解彼此的编码,也没有人支持别人的编码。当时,中国人想要电脑显示汉字,就必须安装“汉字系统”,专门用来处理汉字的显示和输入。如果安装了错误的字符系统,显示就会混乱。该怎么办?这时,一个名为ISO(国际标准化组织)的国际组织决定解决这个问题。他们采用的方法很简单:废弃所有区域编码方案,创建一个包含地球上所有文化、字母和符号的新编码!他们计划将其称为“通用多八位字节编码字符集”,简称UCS,俗称UNICODE。

当Unicode 首次开发时,计算机内存容量已大幅增长,空间不再是问题。因此ISO直接规定必须用两个字节,即16位来统一表示所有字符。对于ASCII 中的那些“半角”字符,UNICODE 保持原来的编码不变,只是将其长度从原来的8 位扩展为16 位,而来自其他文化和语言的字符则全部重新编码。由于“半角”英文符号只需要使用低8位,所以高8位始终为0。因此,这种慷慨的解决方案在保存英文文本时会浪费两倍的空间。当表示Unicode 字符时,通常使用“U+”后跟一组十六进制数字来表示该字符。 Unicode的编码范围是从U+0000到U+10FFFF,总共有1,112,064个代码点可用于映射字符。 Unicode 编码空间可分为17 个平面,每个平面包含216 (65,536) 个代码点。这17个平面的码位可以表示为从U+xx0000到U+xxFFFF,其中xx表示00到10的十六进制值,总共17个平面。第一个平面称为基本多语言平面(BMP) 或平面0。其他平面称为补充平面。在基本多语言平面中,从U+D800到U+DFFF的码点块被永久保留,并且不映射到Unicode字符。 Unicode的编码方式是UCS-2,是一种双字节编码方式,针对的是Basic Multilingual Plane(BMP),对应的辅助平面对应的是UCS-4。
6. UTF系列
虽然Unicode可以覆盖世界上所有的符号,但由于Unicode在制定时并未考虑与任何现有的编码方案兼容,因此没有直接的方法将Unicode转换为另一种编码。必须通过查表来进行。因此,Unicode在很长一段时间内都没有得到很大的推广和普及。而且由于计算机网络的兴起,Unicode如何在网络上传输也是一个非常重要的问题。这时,面向传输的Unicode实现就出现了。字符的Unicode 编码是确定的。但在实际传输过程中,由于不同系统平台的设计不一定一致,并且出于节省空间的目的,Unicode编码的实现方式也有所不同。 Unicode 的实现称为Unicode Transformation Format(简称UTF)。其中,UTF家族最著名的有UTF-8、UTF-16、UTF-32等。
6.1 UTF-8
UTF-8 是一种可变长度编码方法。它可以用1~4个字节来表示一个符号,字节长度根据不同的符号而变化。 例如,如果一个Unicode符号仅包含基本的7位ASCII字符,那么如果每个字符都使用2字节的原始Unicode编码来传输,则第一个字节的8位将始终为0,这会造成较大的浪费。这种情况下,可以使用UTF-8编码,因为这是一种变长编码,仍然使用7位编码来表示基本的7位ASCII字符,占用一个字节(第一位用0填充) )。 UTF-8的编码方式比较简单: 对于单字节符号,字节的第一位设置为0,接下来的7位是该符号的Unicode代码。因此,对于英文字母,UTF-8编码和ASCII码是相同的;对于n 字节符号(n 1),第一个字节的前n 位设置为1,第n + 1 位设置为0。后续字节的前两位始终设置为10。其余的未提及的二进制位均为该符号的Unicode码;编码规则如下(上面是十六进制范围,下面是二进制范围): Unicode符号范围(十六进制) UTF-8编码方式(二进制) 0000 0000-0000 007F0xxxxx

xx0000 0080-0000 07FF110

用户评论

揉乱头发

想做web开发就必须学习字符编码吧!太重要了!

    有18位网友表示赞同!

在哪跌倒こ就在哪躺下

我最近在学习字符编码,感觉真的很有必要,以前很多问题都理解不了。

    有16位网友表示赞同!

话少情在

这篇文章刚好能解决我现在的困惑,原来字符编码那么复杂哦。

    有6位网友表示赞同!

赋流云

不同的编码标准,带来的差异真的太大,我要好好学习起来!

    有6位网友表示赞同!

Edinburgh°南空

学习一下字符编码可以避免一些开发中的BUG,提高代码质量啊。

    有6位网友表示赞同!

此刻不是了i

字符编码的概念其实很有意思,涉及到很多文化和历史因素。

    有15位网友表示赞同!

稳妥

以后程序遇到乱码问题,就知道要从编码开始着手了!

    有10位网友表示赞同!

*巴黎铁塔

这篇文章写得很好理解,推荐给所有学习编程的朋友看。

    有14位网友表示赞同!

?娘子汉

字符编码虽然不是那么有趣,但却是基础知识啊,必须掌握。

    有16位网友表示赞同!

拥抱

原来不同语言的程序员,用的编码标准不一样呢?

    有14位网友表示赞同!

々爱被冰凝固ゝ

想学好网页设计,了解字符编码是必不可少的!

    有16位网友表示赞同!

我就是这样一个人

学习完字符编码之后,应该能更好地理解代码和数据之间的关系了。

    有19位网友表示赞同!

丢了爱情i

以后看源代码的时候,就知道用什么编码解码了~!

    有10位网友表示赞同!

風景綫つ

这篇文章让我对字符编码有了更深入的了解。

    有10位网友表示赞同!

繁华若梦

之前一直不知道什么是Unicode编码,现在明白了~

    有15位网友表示赞同!

旧事酒浓

学习技术真是无止境啊,今天就从字符编码开始啦!

    有13位网友表示赞同!

妄灸

希望以后不会再遇到乱码的问题了!

    有11位网友表示赞同!

淡抹丶悲伤

这篇文章的例子都很好理解,学习起来方便很多!

    有9位网友表示赞同!

爱你心口难开

感谢作者分享这么棒的文章!

    有17位网友表示赞同!

【深入解析字符编码原理与应用】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活