几种常见字符集与字符编码

字符集的概念

  字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。

  而字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同。

常用字符集

  ASCII字符集、GB2312字符集、GBK字符集、 USC-3字符集、Unicode字符集等。

字符编码的概念

  字符编码(英语:Character encoding)也称字集码,是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。

常用字符编码

  ASCII编码、GB2312编码、GBK编码、UFT-8编码等字符编码。

注意:不要把字符集和字符编码两者弄混淆。虽然他们有些同名,比如ASCII有字符集也有ASCII的字符编码,他们是两个不同的概念。

下面我们详细讲解几种常用的字符集和字符编码

1 ASCII字符集和ASCII编码

  ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语,而其扩展版本EASCII则可以勉强显示其他西欧语言。它是现今最通用的单字节编码系统(但是有被Unicode追上的迹象),并等同于国际标准ISO/IEC 646

ASCII字符集:主要包括控制字符(回车键、退格、换行键等);可显示字符(英文大小写字符、阿拉伯数字和西文符号)。 

ASCII编码:将ASCII字符集转换为计算机可以接受的数字系统的数的规则。使用7位(bits)表示一个字符,共128字符;但是7位编码的字符集只能支持128个字符,为了表示更多的欧洲常用字符对ASCII进行了扩展,ASCII扩展字符集使用8位(bits)表示一个字符,共256字符。

  ASCII的最大缺点是只能显示26个基本拉丁字母、阿拉伯数目字和英式标点符号,因此只能用于显示现代美国英语(而且在处理英语当中的外来词如naïve、café、élite等等时,所有重音符号都不得不去掉,即使这样做会违反拼写规则)。而EASCII虽然解决了部份西欧语言的显示问题,但对更多其他语言依然无能为力。因此现在的苹果电脑已经抛弃ASCII而转用Unicode。

2 GBXXXX字符集和GBXXXX编码

  为了显示中文,必须设计一套编码规则用于将汉字转换为计算机可以接受的数字系统的数。

  规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,还把数学符号、罗马希腊的 字母、日文的假名们都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。

  上述编码规则就是GB2312GB2312GB2312-80中国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,又称GB0,由中国国家标准总局发布,1981年5月1日实施。GB2312编码通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB2312。GB2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。对于人名古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBKGB 18030汉字字符集的出现。

3 GIG5字符集和BIG5编码

  Big5,又称为大五码五大码,是使用繁体中文(正体中文)社区中最常用的电脑汉字字符集标准,共收录13,060个汉字。中文码分为内码及交换码两类,Big5属中文内码,知名的中文交换码有CCCII、CNS11643。Big5虽普及于台湾、香港与澳门等繁体中文通行区,但长期以来并非当地的国家标准,而只是业界标准。倚天中文系统、Windows等主要系统的字符集都是以Big5为基准,但厂商又各自增加不同的造字与造字区,派生成多种不同版本。2003年,Big5被收录到CNS11643中文标准交换码的附录当中,取得了较正式的地位。这个最新版本被称为Big5-2003。

BIG5编码:Big5码是一套双字节字符集,使用了双八码存储方法,以两个字节来安放一个字。第一个字节称为"高位字节",第二个字节称为"低位字节"。"高位字节"使用了0x81-0xFE,"低位字节"使用了0x40-0x7E,及0xA1-0xFE。在Big5的分区中:

0x8140-0xA0FE 保留给用户自定义字符(造字区)
0xA140-0xA3BF 标点符号、希腊字母及特殊符号,包括在0xA259-0xA261,安放了九个计量用汉字:兙兛兞兝兡兣嗧瓩糎。
0xA3C0-0xA3FE 保留。此区没有开放作造字区用。
0xA440-0xC67E 常用汉字,先按笔划再按部首排序。
0xC6A1-0xC8FE 保留给用户自定义字符(造字区)
0xC940-0xF9D5 次常用汉字,亦是先按笔划再按部首排序。
0xF9D6-0xFEFE 保留给用户自定义字符(造字区)

4 Unicode字符集和UTF编码

Unicode字符集的由来:

  为了适合当地语言和字符,设计和实现类似GB232/GBK/GB18030/BIG5的编码方案。这样各搞一套,在本地使用没有问题,一旦出现在网络中,由于不兼容,互相访问就出现了乱码现象。为了解决这个问题,一个伟大的创想产生了——Unicode。

Unicode编码系统为表达任意语言的任意字符而设计。它使用4字节的数字来表达每个字母、符号,或者表意文字(ideograph)。每个数字代表唯一的至少在某种语言中使用的符号。(并不是所有的数字都用上了,但是总数已经超过了65535,所以2个字节的数字是不够用的。)被几种语言共用的字符通常使用相同的数字来编码,除非存在一个在理的语源学(etymological)理由使不这样做。

UTF编码:

UTF-8:UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。

UTF-16:UTF-16是Unicode字符编码五层次模型的第三层:字符编码表(Character Encoding Form,也称为 "storage format")的一种实现方式。即把Unicode字符集的抽象码位映射为16位长的整数(即码元)的序列,用于数据存储或传递。Unicode字符的码位,需要1个或者2个16位长的码元来表示,因此这是一个变长表示。

UTF-32:UTF-32 (或 UCS-4)是一种将Unicode字符编码的协定,对每一个Unicode码位使用恰好32位元。其它的Unicode transformation formats则使用不定长度编码。因为UTF-32对每个字符都使用4字节,就空间而言,是非常没有效率的。特别地,非基本多文种平面的字符在大部分文件中通常很罕见,以致于它们通常被认为不存在占用空间大小的讨论,使得UTF-32通常会是其它编码的二到四倍。虽然每一个码位使用固定长定的字节看似方便,它并不如其它Unicode编码使用得广泛。

5 MBCS编码

  为了扩充ASCII编码,以用于显示本国的语言,不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码,又称为"MBCS(Muilti-Bytes Charecter Set,多字节字符集)"。在简体中文系统下,ANSI 编码代表 GB2312 编码。所以在中文 windows下要转码成gb2312,gbk只需要把文本保存为ANSI 编码即可。

注:其中每个语言下的ANSI编码,都有一套一对一的编码转换器,Unicode变成所有编码转换的中间介质。所有的编码都有一个转换器可以转换到Unicode,而Unicode也可以转换到其他所有的编码。

6 base64编码

  有的电子邮件系统(比如国外信箱)不支持非英文字母(比如汉字)传输,这是历史原因造成的(认为只有美国会使用电子邮件?)。因为一个英文字母使用ASCII编码来存储,占存储器的1个字节(8位),实际上只用了7位2进制来存储,第一位并没有使用,设置为0,所以,这样的系统认为凡是第一位是1的字节都是错误的。而有的编码方案(比如GB2312)不但使用多个字节编码一个字符,并且第一位经常是1,于是邮件系统就把1换成0,这样收到邮件的人就会发现邮件乱码。

  为了能让邮件系统正常的收发信件,就需要把由其他编码存储的符号转换成ASCII码来传输。比如,在一端发送GB2312编码->根据Base64规则->转换成ASCII码,接收端收到ASCII码->根据Base64规则->还原到GB2312编码。

时间: 2024-10-12 20:50:48

几种常见字符集与字符编码的相关文章

每一个程序员必须掌握的知识,字符集与字符编码.

1. 基础知识 计算机中储存的信息都是用二进制数表示的:而我们在屏幕上看到的英文.汉字等字符是二进制数转换之后的结果.通俗的说,按照何种规则将字符存储在计算机中,如'a'用什么表示,称为"编码":反之,将存储在计算机中的二进制数解析显示出来,称为"解码",如同密码学中的加密和解密.在解码过程中,如果使用了错误的解码规则,则导致'a'解析成'b'或者乱码. 字符集(Charset):是一个系统支持的所有抽象字符的集合.字符是各种文字和符号的总称,包括各国家文字.标点符

刨根究底字符编码之十——Unicode字符集的字符编码方式CEF以及码点、码元

Unicode字符集的字符编码方式CEF以及码点.码元 一.字符编码方式CEF的选择 1. 由于Unicode字符集非常大,有些字符的编号(码点值)需要两个或两个以上字节来表示,而要对这样的编号进行编码,也必须使用两个或两个以上字节. 比如,汉字"严"的Unicode码(Unicode码点值.Unicode编号)是十六进制数4E25,转换成二进制数有15位(100 1110 0010 0101),对"严"这个字符的编号进行编码的话,至少需要2个字节.表示其他更大编号

字符,字符集,字符编码

字符,字符集,字符编码 简书郭文圣 现在Unicode已然一统天下,我想很多年轻的程序员可能都没遇到过编码问题,更不用说了解编码的发展了.前些日子在一个老网站上偶遇乱码,虽然入行时间不短,但对其究竟也是不甚了解,好奇心驱使下落入深坑.还好经过一段时间的摸爬滚打,边学边写,总算大概理清了个脉络,记录之,分享之. 概念 字符是一个信息单位,在计算机里面,一个中文汉字是一个字符,一个英文字母是一个字符,一个阿拉伯数字是一个字符,一个标点符号也是一个字符. 字符集是字符组成的集合,通常以二维表的形式存在

字符集与字符编码的强化理解与操作实践

字符集与字符编码的强化理解与操作实践 踩坑 最近在工作中遇到了一个说大不大说小不小的问题,就是当我解析一个xml文件的时候,抛出了一个"Invalid byte 2 of 2-byte UTF-8 sequence"的异常,这个异常会导致解析直接退出,显然不能容忍.查阅相关资料稍微定位了一下,大概知道是字符集的问题,仔细一看,xml文件中的确有中文字符,而且当我把这些中文字符删了之后的确又能解析成功.不过我还是不能理解这当中的缘由,不过由于时间原因,当时只是把中文字符删了就草草完工.现

搞定字符集与字符编码

1.什么是字符集? 字符:文字.符号.包含各个国家文字.标点符号,图形,数字等 字符集:多个字符的集合(多个文字.符号的集合),不同字符集包含的字符个数不同. 2.什么是字符编码? 字符编码:字符集只字符的集合,不适用于网络传输,计算机想准确处理及向硬盘存储各种字符集中的文字.符号,需要经过字符编码,010101的组合对应哪种字符集中的哪些文字,字符编码就是将文字与符号转换为计算机可以接受的数字用于存储与网络传送,就叫字符编码. 简单的说,字符编码就是以二进制的数字来对应字符集中的字符.对字符进

字符集与字符编码

[转]字符集和字符编码(Charset & Encoding)----谢谢博主 --每个软件开发人员应该无条件掌握的知识! --Unicode伟大的创想! 相信大家一定碰到过,打开某个网页,却显示一堆像乱码,如"б?ЯАзЪСЯ"."?????????"?还记得HTTP中的Accept-Charset.Accept-Encoding.Accept-Language.Content-Encoding.Content-Language等消息头字段?这些就是接下来

(转)字符集与字符编码

转载自:http://blog.sina.com.cn/s/blog_5e4814ec01014prk.html 从第一次开始写web程序,自己还有身边同事开发出现乱码情况基本都没有消停过.估计以后还会一样继续.这么些年,不断修修改改,也总结也归纳.程序从asp,asp.net,jsp,php,服务器从windows到linux,数据库也从sqlserver,mysql到oracle:它还是偶尔会出现.好了,我总结下我与它较量的一些收获吧.乱码都与字符集有关系,一切都从它开始说. 什么是字符集,

字符集与字符编码 (charset & encoding)

乱码是个大坑,相信每个人都遇过,而且是个绕不过去的坑.我理解每个程序员都应该写一篇编码相关的博文,梳理自己对这一块的理解,下面是我反复理解多次之后的学习小结. 1.从记事本的不同编码说起: 打开记事本,输入“我我”,保存为ansi编码(其实是gb2312,这也是默认编码).再分别另存为unicode(其实是utf-16 little endian).unicodeBigEndian(其实是utf-16 big endian).utf8,用UltraEdit打开,切换到二进制模式,内容如下: 编码

字符集与字符编码详解

字符 字符和字节不太一样,任何一个文字或符号都是一个字符,但是所占字节不一定,不同的编码导致一个字符所占的内存不同. 例如:标点符号"+"是一个字符,汉字"我们"是两个字符,在GBK编码中一个汉字占2个字节,在UTF-8编码中一个汉字占3个字节. 随着时代的发展,程序员们希望在计算机中显示字符,但计算机只能识别0和1的二进制数.于是就有了编码规范. 编码规范 所谓的字符集其实是一套编码规范中的子概念,为了显示字符,国际组织就指定了编码规范,希望使用不同的二进制数来表