编码字符集

简介: 在计算机中,只有二进制的数据,不管数据是在内存中,还是在外部存储设备上。对于我们所看到的字符,也是以二进制数据的形式存在的。不同字符对应二进制数的规则,就是字符的编码。字符编码的集合称为字符集。

****常用******字符集**


在早期的计算机系统中,使用的字符非常少,这些字符包括26个英文字母、数字符号和一些常用符号(包括控制符号),对这些字符进行编码,用1个字节就足够了(1个字节可以表示28=256种字符)。然而实际上,表示这些字符,只使用了1个字节的7位,这就是ASCII编码。

*1.ASCII*

ASCII(American Standard Code for Information Interchange,美国信息互换标准代码),是基于常用的英文字符的一套电脑编码系统。每一个**ASCII码**与一个8位(bit)二进制数对应。其最高位是0,相应的十进制数是0~127。例如,数字字符“0”的编码用十进制数表示就是48。另有128个扩展的ASCII码,最高位都是1,由一些图形和画线符号组成。ASCII是现今最通用的单字节编码系统。

ASCII用一个字节来表示字符,最多能够表示256种字符。随着计算机的普及,许多国家都将本地的语言符号引入到计算机中,扩展了计算机中字符的范围,于是就出现了各种不同的字符集。

*2.ISO8859-1*

因为ASCII码中缺少****£、ü和许多书写其他语言所需的字符****,为此,可以通过指定128以后的字符来扩展ASCII码。国际标准组织(ISO)定义了几个不同的字符集,它们是在ASCII码基础上增加了其他语言和地区需要的字符。

其中最常用的是ISO8859-1,通常叫做Latin-1。Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符,其中0~127的字符与ASCII码相同。ISO 8859另外定义了14个适用于不同文字的字符集(8859-2到8859-15)。这些字符集共享0~127的ASCII码,只是每个字符集都包含了128~255的其他字符。

*3.GB2312和GBK*

GB2312是中华人民共和国国家标准汉字信息交换用编码,全称《信息交换用汉字编码字符集-基本集》,标准号为GB2312-80,是一个由中华人民共和国国家标准总局发布的关于简化汉字的编码,通行于中国大陆和新加坡,简称国标码。

因为中文字符数量较多,所以采用两个字节来表示一个字符,分别称为高位和低位。为了和ASCII码有所区别,中文字符的每一个字节的最高位都用1来表示。GB2312字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,也是最基本的中文字符集。它包含了大部分常用的一、二级汉字和9区的符号,其编码范围是高位0xa1-0xfe,低位也是0xa1-0xfe,汉字从0xb0a1开始,结束于0xf 7fe。

为了对更多的字符和符号进行编码,由前电子部科技质量司和国家技术监督局标准化司于1995年12月颁布了GBK(K是“扩展”的汉语拼音第一个字母)编码规范,在新的编码系统里,除了完全兼容GB2312外,还对繁体中文、一些不常用的汉字和许多符号进行了编码。

*GBK********

***也是现阶段Windows和其他一些中文操作系统的默认字符集,但并不是所有的国际化软件都支持该字符集。****不过要注意的是GBK不是国家标准,它只是规范。GBK字符集包含了20 902个汉字,其编码范围是0x8140-0xfefe。

每个国家(或区域)都规定了计算机信息交换用的字符编码集,这就造成了交流上的困难。想像一下,你发送一封中文邮件给一位远在西班牙的朋友,当邮件通过网络发送出去的时候,你所书写的中文字符会按照本地的字符集GBK转换为二进制编码数据,然后发送出去。当你的朋友接收到邮件(二进制数据)后,查看信件时,会按照他所用系统的字符集,将二进制编码数据解码为字符,然而由于两种字符集之间编码的规则不同,导致转换出现乱码。这是因为,在不同的字符集之间,同样的数字可能对应了不同的符号,也可能在另一种字符集中,该数字没有对应符号。

*为了解决上述问题,统一全世界的字符编码,由Unicode协会制定并发布了Unicode编码。*

*4.Unicode*

Unicode(统一的字符编码标准集)使用0~65 535的双字节无符号数对每一个字符进行编码。它不仅包含来自英语和其他西欧国家字母表中的常见字母和符号,也包含来自古斯拉夫语、希腊语、希伯来语、阿拉伯语和梵语的字母表。另外还包含汉语和日语的象形汉字和韩国的Hangul音节表。

目前已经定义了40 000多个不同的Unicode字符,剩余25 000个空缺留给将来扩展使用。其中大约20 000个字符用于汉字,另外11 000左右的字符用于韩语音节。Unicode中0~255的字符与ISO8859-1中的一致。

Unicode编码对于英文字符采取前面加“0”字节的策略实现等长兼容。如“a”的ASCII码为0x61,Unicode码就为0x00,0x61。

****5.******UTF-8**

使用Unicode编码,一个英文字符要占用两个字节,在Internet上,大多数的信息都是用英文来表示的,如果都采用Unicode编码,将会使数据量增加一倍。为了减少存储和传输英文字符数据的数据量,可以使用UTF-8编码。

UTF-8全称是Eight-bit UCS Transformation Format(UCS,Universal Character Set,通用字符集,UCS是所有其他字符集标准的一个超集)。对于常用的字符,即0~127的ASCII字符,UTF-8用一个字节来表示,这意味着只包含7位ASCII字符的字符数据在ASCII和UTF-8两种编码方式下是一样的。如果字符对应的Unicode码是0x0000,或在0x0080与0x007f之间,对应的UTF-8编码是两个字节,如果字符对应的Unicode码在0x0800与0xffff之间,对应的UTF-8编码是三个字节。因为中文字符的Unicode编码在0x0800与0xffff之间,所以数据如果是中文,采用UTF-8编码数据量会增加50%。

Unicode与UTF-8转换的规则简述如下:

(1)如果Unicode编码的16位二进制数的前9位是0,则UTF-8编码用1个字节来表示,这个字节的首位是“0”,剩下的7位与原二进制数据的后7位相同。例如:

Unicode编码:\u0061 = 00000000 01100001

UTF-8编码:01100001 = 0x61

(2)如果Unicode编码的16位二进制数的头5位是0,则UTF-8编码用2个字节来表示,首字节以“110”开头,后面的5位与原二进制数据除去前5个零后的最高5位相同;第二个字节以“10”开头,后面的6位与原二进制数据中的低6位相同。例如:

Unicode编码:\u00A9 = 00000000 10101001

UTF-8编码:11000010 10101001 = 0xC2 0xA9

(3)如果不符合上述两个规则,则用三个字节表示。第一个字节以“1110”开头,后四位为原二进制数据的高四位;第二个字节以“10”开头,后六位为原二进制数据中间的六位;第三个字节以“10”开头,后六位为原二进制数据的低六位。例如:

Unicode编码:\u4E2D = 01001110 00101101

UTF-8编码:11100100 10111000 10101101 = 0xE4 0xB8 0xAD

在UTF-8编码的多字节串中,第一个字节开头“1”的数目就是整个字符串中字节的数目。

*对乱码产生过程的分析*

为了让使用**Java语言**编写的程序能在各种语言的平台下运行,Java在其内部****使用Unicode字符集来表示字符****,这样就****存在Unicode字符集和本地字符集进行转换的过程****。当在Java中读取字符数据的时候,需要将本地字符集编码的数据转换为Unicode编码,而在输出字符数据的时候,则需要将Unicode编码转换为本地字符集编码。

例如,在中文系统下,从控制台读取一个字符“中”,实际上读取的是“中”的GBK编码0xD6D0,在Java语言中要将GBK编码转换为Unicode编码0x4E2D,此时,在内存中,字符“中”对应的数值就是0x4E2D,当我们向控制台输出字符时,Java语言将Unicode编码再转换为GBK编码,输出到控制台,中文系统再根据GBK字符集画出相应的字符。

从上述过程来看,读取和写入的过程是可逆的,那么理应不会出现中文乱码问题。然而,实际应用的情形,比上述过程要复杂得多。在Web应用中,通常都包括了浏览器、Web服务器、Web应用程序和数据库等部分,每一部分都有可能使用不同的字符集,从而导致字符数据在各种不同的字符集之间转换时,出现乱码的问题。

目录
相关文章
|
3月前
|
云安全 安全 Go
云:私有云与公有云对比
公有云与私有云安全的区别
176 1
|
3月前
|
供应链 安全 区块链
构建未来:区块链技术在供应链管理中的应用
【4月更文挑战第4天】 随着数字化转型的浪潮汹涌而来,区块链技术以其独特的不可篡改性、透明度和去中心化特性,在众多行业中崭露头角。本篇文章深入探讨了区块链在供应链管理领域的创新应用,揭示了如何通过分布式账本技术增强供应链的追踪能力、提高效率及安全性。文章分析了区块链对现有供应链管理模式的冲击与挑战,并展望了其在未来发展中的潜力与趋势。
225 7
|
3月前
|
监控 NoSQL 算法
宕机后,Redis如何实现快速恢复
宕机后,Redis如何实现快速恢复
85 2
|
3月前
|
搜索推荐 算法 Java
基于springboot+vue协同过滤算法的电影推荐系统
基于springboot+vue协同过滤算法的电影推荐系统
|
3月前
|
JSON API 开发工具
电商API接口入门指南
API(应用程序编程接口)是一种让不同软件之间进行通信的方式。在电子商务中,API可以用于获取商品信息、下单、支付等等。本篇文章将介绍电商API接口的入门知识,并提供示例代码以帮助你快速上手。
|
3月前
|
消息中间件 存储 程序员
RabbitMQ消息丢失的场景,如何保证消息不丢失?(详细讲解,一文看懂)
RabbitMQ消息丢失的场景,如何保证消息不丢失?(详细讲解,一文看懂)
287 0
RabbitMQ消息丢失的场景,如何保证消息不丢失?(详细讲解,一文看懂)
|
存储 Java 关系型数据库
【精炼易懂】字符集、编码、乱码问题、ASCII、GBK、Unicode、UTF-8详解+实例说明
【精炼易懂】字符集、编码、乱码问题、ASCII、GBK、Unicode、UTF-8详解+实例说明
5478 4
|
数据采集 编解码 网络性能优化
ADC噪声全面分析 -02- ADC 噪声测量方法和相关参数
ADC噪声全面分析 -02- ADC 噪声测量方法和相关参数
649 0
ADC噪声全面分析 -02- ADC 噪声测量方法和相关参数
|
算法 决策智能
基于遗传算法解决TSP问题(Matlab代码实现)
基于遗传算法解决TSP问题(Matlab代码实现)
332 0
|
存储 缓存 监控
Linux系统之 OOM 解析
在实际的业务场景中,有没有发现这样一种场景:基于 VM 环境上面所部署的 Spring Boot 应用服务,往往在运行过程中将内存利用的足够“猥琐”,常常达到 90% 甚至以上,此时,很大一部分伙伴就开始“叫”了。曰:领导,内存不够了,赶紧扩容!!!(此刻,有大佬肯定在想:扩什么,整天搞这些没用的~)
273 0