深入了解字符集和编码问题

对于字符集,编码的问题, 一直都搞不太明白, 下面好好学习一下

一、什么是字符集?什么是编码? 

字符(Character)是文字与符号的总称,包括文字(中文汉字, 英文字母)、图形符号、数学符号等。 
一组抽象(可能按某一维度来区分不同的字符,比如按照语言,将字符分类,分为中文字符集、英文字符集)字符的集合就是字符集(Charset)。它是字符的集合,也可以理解为字符的分类,比如英文字符集、中文字符集等。

 
字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集。 
一组有共同特征的字符也可以组成字符集,比如繁体汉字字符集、日文汉字字符集。 
字符集的子集也是字符集。 

计算机要处理各种字符,就需要将字符和二进制内码对应起来(因为计算机只能识别二进制)这种对应关系就是字符编码(Encoding)。 
制定编码首先要确定字符集,并将字符集内的字符排序,然后和二进制数字对应起来。根据字符集内字符的多少,会确定用几个字节来编码。 
每种编码都限定了一个明确的字符集合,叫做被编码过的字符集(Coded Character Set),这是字符集的另外一个含义。通常所说的字符集大多是这个含义。

 

二、有哪些字符集? 

ASCII: 
American Standard Code for Information Interchange,美国信息交换标准码。 
目前计算机中用得最广泛的字符集及其编码,由美国国家标准局(ANSI)制定。 
它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。 
ASCII字符集由控制字符和图形字符组成。 
在计算机的存储单元中,一个ASCII码值占一个字节(8个二进制位),其最高位(b7)用作奇偶校验位。 
所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。 
奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1。 
偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。 

ISO 8859-1: 
ISO 8859,全称ISO/IEC 8859,是国际标准化组织(ISO)及国际电工委员会(IEC)联合制定的一系列8位字符集的标准,现时定义了15个字符集。 
ASCII收录了空格及94个“可印刷字符”,足以给英语使用。 
但是,其他使用拉丁字母的语言(主要是欧洲国家的语言),都有一定数量的变音字母,故可以使用ASCII及控制字符以外的区域来储存及表示。 
除了使用拉丁字母的语言外,使用西里尔字母的东欧语言、希腊语、泰语、现代阿拉伯语、希伯来语等,都可以使用这个形式来储存及表示。 
    *很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。 


但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。
而且在很多协议上,默认使用该编码。 

Unicode: 
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。 

它是http://www.unicode.org制定的编码机制, 要将全世界常用文字都函括进去 

Unicode只定义了什么字符对应的二进制是什么, 但是具体这个字符在计算机中占用多少个字节数, 并没有规定。

 

utf-8、utf-16是具体规定了占用多少个字节数


    * UTF-8: 8bit变长编码,对于大多数常用字符集(ASCII中0~127字符)它只使用单字节,而对其它常用字符(特别是朝鲜和汉语会意文字),它使用3字节, 还有占用4个字节。 
    * UTF-16: 16bit编码,是占用定长字节数, 两个字节。

汉字编码: 
    * GB2312字集是简体字集,全称为GB2312(80)字集,共包括国标简体汉字6763个 
    * BIG5字集是台湾繁体字集,共包括国标繁体汉字13053个。 
    * GBK字集是简繁字集,包括了GB字集、BIG5字集和一些符号,共包括21003个字符。 
    * GB18030是国家制定的一个强制性大字集标准,全称为GB18030-2000,它的推出使汉字集有了一个“大一统”的标准。 


三、编程语言与编码 

C、C++、Python2内部字符串都是使用当前系统默认编码 
Python3、Java内部字符串用Unicode保存 
Ruby有一个内部变量$KCODE用来表示可识别的多字节字符串的编码,变量值为EUC SJIS UTF8 NONE之一。 


四、为什么会乱码? 

乱码是个老问题,从上面我们知道,字符在保存时的编码格式如果和要显示的编码格式不一样的话,就会出现乱码问题。 
我们的Web系统,从底层数据库编码、Web应用程序编码到HTML页面编码,如果有一项不一致的话,就会出现乱码。 
所以,解决乱码问题说难也难说简单也简单,关键是让交互系统之间编码一致。 

五、有没有万金油? 

在如此多种编码和字符集弄的我们眼花缭乱的情况下,我们只需选择一种兼容性最好的编码方式和字符集,让它成为我们程序子系统之间 
交互的编码契约,那么从此恼人的乱码问题即将远离我们而去 -- 这种兼容性最好的编码就是UTF-8! 
毕竟GBK/GB2312是国内的标准,当我们大量使用国外的开源软件时,UTF-8才是编码界最通用的语言。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值