Unicode编码以及UTF、UCS等概念理解

       最近在搞一个服务器打包软件,因为在打包软件中,会调用很多配置文件,这些配置文件,开始的时候,我为了方便很多都是用的GB2312编码,开始完成了以后,打包简体中文版本的我们公司的服务器,没有任何问题,一切正常;过了一段时间,海外事业部要求我给他们打包一个繁体中文的服务器,以适应台湾等地区的要求,这下就把我难住了,因为整个打包程序的编码格式都要改为Unicode的编码。那么问题就来了,原来的GB2312的配置文件都会出现问题,因为GB2312的编码跟Unicode编码,没有绝对的映射关系,程序从配置文件中读取的数据都是乱码;

      为了解决这个问题,最近特地从网上查找相关文档,研究了下Unicode编码、GBK编码等;现在做个简单的介绍:

一、ASCII码:

      最古老的编码,基本上所有的编码都兼容了ASCII编码;ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符

其中:0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。

32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。

65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

同时还要注意,在标准ASCII中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。

后128个称为扩展ASCII码。许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展ASCII 码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号

二、ISO/IEC 8859-1(15)

ISO 8859-1,正式编号为ISO/IEC 8859-1:1998,又称Latin-1或“西欧语言”,是国际标准化组织内ISO/IEC 8859的第一个8位字符集。它以ASCII为基础,在空置的0xA0-0xFF的范围内,加入96个字母及符号,藉以供使用附加符号的拉丁字母语言使用。

ISO 8859-15,正式编号为ISO/IEC 8859-15:1999,又称Latin-9,俗称Latin-0,是国际标准化组织内ISO/IEC 8859的其中一个8位字符集。一般Mysql默认选择的字符集就是Latin-0。

三、GB类型编码

  1、GB2312编码

   GB2312编码,有些人又称它为简体中文编码;随着计算机的普及,我天朝人民也需要使用计算机了,等中国人们得到计算机时,已经没有可以利用的字节状态来表示汉字,况且有6000多个常用汉字需要保存呢。 
  但是这难不倒智慧的中国人民,我们不客气地把那些127号之后的奇异符号们直接取消掉, 规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。 
  在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在127号以下的那些就叫”半角”字符了。 中国人民看到这样很不错,于是就把这种汉字方案叫做 “GB2312“。GB2312 是对 ASCII 的中文扩展。

2、GBK编码和GB18030编码

       虽然GB2312编码在一定程度上满足了中国人对汉字等编码的需求,但是大家都知道,汉字的数量远不止GB2312所归纳的那么多,数以十万记的汉字需要一套更为完整的编码方式。于是我们不得不继续把GB2312 没有用到的码位找出来老实不客气地用上。 
后来还是不够用,于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。结果扩展之后的编码方案被称为 GBK 标准,GBK包括了GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。 后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK扩成了 GB18030。从此之后,中华民族的文化就可以在计算机时代中传承了。 中国的程序员们看到这一系列汉字编码的标准是好的,于是通称他们叫做 “DBCS“(Double Byte Charecter Set 
双字节字符集)。在DBCS系列标准里,最大的特点是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里,因此他们写的程序为了支持中文处理,必须要注意字串里的每一个字节的值,如果这个值是大于127的,那么就认为一个双字节字符集里的字符出现了。那时候凡是受过加持,会编程的计算机僧侣 们都要每天念下面这个咒语数百遍: “一个汉字算两个英文字符!一个汉字算两个英文字符……”

三、Unicode编码:

背景介绍:在当时,因为没有一个统一的编码方式存在,在世界各地,存在有很多种编码方式,比如中文的GBK,欧盟用的Latin等等,随时世界的全球化,越来越要求出现一种统一的编码,兼容各种编码方式;在这个大环境下面,有两个组织,都意识到了这个问题,分别是ISO组织和一个软件制造商的协会(unicode.org)SO开发了ISO 10646项目,Unicode协会开发了Unicode项目;在1991年前后,双方都认识到世界不需要两个不兼容的字符集。于是它们开始合并双方的工作成果,并为创立一个单一编码表而协同工作。从Unicode2.0开始,Unicode项目采用了与ISO 10646-1相同的字库和字码。目前两个项目仍都存在,并独立地公布各自的标准。Unicode协会现在的最新版本是2005年的Unicode 4.1.0。ISO的最新标准是10646-3:2003。

Unicode是一种字符编码方法,可以容纳全世界所有语言文字的编码方案。Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode Character Set"的缩写。UCS规定了怎么用多个字节表示各种文字。怎样传输这些编码,是由UTF(UCS Transformation Format)规范规定的;现在肯定很多人都会有个疑问,既然已经有了UCS编码为什么还要出现UTF编码的实现呢?其实,原因也很简单,UCS编码是一种定长编码方式,比如UCS_2就是每个字符都占用两个字节的编码,这种编码的好处就是简单,没有繁琐的编码方式,什么东西都是两个字节来处理,处理起来效率高,但是他也有一个很大的弊端,就是看空间的浪费,举个例子,Unicode编码是兼容ASCII码的,每个ASCII里面的字符,实际上都只需要一个字节就够了,但是在Unicode编码中,都会占用两个字节,这样就会造成大量空间的浪费;除了空间浪费外,还存在着其他问题,比如对于像Linux等操作系统,完全都是基于ANSCII码的基础上开发的,有很多的特殊的字符,以及库,比如文件的读写等,都是有特殊意义的,如果用Unicode编码进行处理,就可能会出现问题,不能够简单的使用Unicode编码。鉴于这些,UTF顺应潮流的需要,随之产生了;

UCS:UCS有两种格式:UCS-2和UCS-4;从名字上就能看出来,UCS-2编码就是占用两个字节的编码长度,UCS_4就是占用四个字节的编码长度。

UTF:

utf编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符,不过,utf编码是不定长编码,每一个字符的长度从1-6个字节不等。另外,utf编码自带简单的校验功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。

注意,虽然说utf是为了使用更少的空间而使用的,但那只是相对于unicode编码来说,如果已经知道是汉字,则使用GB2312/GBK无疑是最节省的。不过另一方面,值得说明的是,虽然utf编码对汉字使用3个字节,但即使对于汉字网页,utf编码也会比unicode编码节省,因为网页中包含了很多的英文字符。

UCS 字符 U+0000 到 U+007F (ASCII) 被编码为字节 0x00 到 0x7F (ASCII 兼容)。 这意味着只包含 7 位 ASCII 字符的文件在 ASCII 和 UTF-8 两种编码方式下是一样的。 
所有 >U+007F 的 UCS 字符被编码为一个多个字节的串, 每个字节都有标记位集。 因此,ASCII 字节 (0x00-0x7F) 不可能作为任何其他字符的一部分。 
表示非 ASCII 字符的多字节串的第一个字节总是在 0xC0 到 0xFD 的范围里, 并指出这个字符包含多少个字节。 多字节串的其余字节都在 0x80 到 0xBF 范围里。 这使得重新同步非常容易, 并使编码无国界,且很少受丢失字节的影响。 
UTF-8 编码字符理论上可以最多到 6 个字节长, 然而 16 位 BMP 字符最多只用到 3 字节长。 
字节 0xFE 和 0xFF 在 UTF-8 编码中从未用到。 
通过,UTF-8这种形式,Unicode终于可以广泛的在各种情况下使用了.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值