详解字节、字符、字符集、编码

名词解析:

位(bit):是计算机 内部数据 储存的最小单位,11001100是一个八位二进制数。
字节(byte):是计算机中数据处理的基本单位,习惯上用大写  B  来表示,1B(byte,字节)= 8bit(位)
字符:是指计算机中使用的字母、数字、字和符号。通常用来表示单个的字符,字符型必须用('')括起来。JAVA使用16位的Unicode字符集作为编码方式,而Unicode被设计成支持世界上所有书面语言的字符,包括中文字符。


1.1 字符与编码的发展



ASCII码:最初美国佬,约定了一个编码系统,就是ASCII码,把abc等英文字符分别和0,1,2,3,4等对应,发现差不多刚好128个数,半个字节的长度,于是干脆取一个字节,最高位置为0。后七位从0-127分别对每一个符号编码。计算机每次读取一个字节,然后参照ASCII表把这些编码翻译成字符。
ISO:欧洲人发现ASCII没办法满足欧洲书面语言符号的需要,于是欧洲人搞一套ISO编码,一个字节的长度,把最高位也用掉了。和ASCII表类似,计算机每次只读一个字节,然后按照ISO表,解码出字符。
GBK:到了我们中国,光汉字有几万个。于是我们整出一套GBK且兼容了ASCII编码。

反正当时还有很多不同的编码标准,因为编码不同,你不懂我、我不懂你,乱码满天飞。

最后国际组织把世界上所有书面语言的字符都进行了统一编号,unicode编号,这个unicode编号的集合就是字符集。

 系统内码说明系统
阶段一ASCII计算机刚开始只支持英语,其它语言不能够在计算机上存储和显示。英文 DOS
阶段二ANSI编码
(本地化)

为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。比如:汉字 '中' 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。


不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。


不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。
中文 DOS,中文 Windows 95/98,日文 Windows 95/98
阶段三UNICODE
(国际化)
为了使国际间信息交流更加方便,国际组织制定了 UNICODE 字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。Windows NT/2000/XP,Linux,Java

1.2 unicode和utf-8等编码方案的联系

unicode编号,解决了解码的冲突,它是一种标准,规定了每个字符对应的二进制数,或者称它是一个具体大的映射。但是unicode并没有规定字符对应的二进制数怎么存储(没有为编码的二进制传输和二进制解码做出规定),比如字母可能对应的数字很小,那么转换为二进制数需要8位(一个字节)就够了,但是汉字就需要14/15/16位才能表示下也就是最少需要两个字节,甚至有些字符需要三个字节才能表示。
于是,就出现了如下解决方案:uft-8,utf-16,utf-32这些编码方案。


1.3 编码方案选择:

utf-8这种解决方案用的最多,用得最多是因为在当时它的方案最好,最节省资源。
utf-8采用变长编码,编码长度从1个字节到6个字节不等,utf-16是用两个字节来编码所有的字符,utf-32则选择用4个字节来编码

PS:目前因为互联网上绝大部分存在的资源都是英文的,英文在utf-16中占2个字节,而在utf-8中则是1个字节,故utf-8更加节省资源。如果中文内容居多,则是utf-16更加节省资源。

1.4 字符,字节,字符串

 概念描述举例
字符人们使用的记号,抽象意义上的一个符号。直接通过单个字符来指定字符型:'1', '中', 'a', '$', '¥', ……
通过转义字符表示特殊的字符型:'\n','\t'
直接通过unicode值来表示字符型:'\uxxxx' xxxx表示一个16进制数
字节计算机中存储数据的单元,一个8位的二进制数,是一个很具体的存储空间。是计算机中数据处理的基本单位,习惯上用大写  B  来表示,1B(byte,字节)= 8bit(位)0x01, 0x45, 0xFA, ……
ANSI
字符串
在内存中,如果“字符”是以 ANSI 编码形式存在的,一个字符可能使用一个字节或多个字节来表示,那么我们称这种字符串为 ANSI 字符串或者多字节字符串。"中文123"
(占7字节)
UNICODE
字符串
在内存中,如果“字符”是以在 UNICODE 中的序号存在的,那么我们称这种字符串为 UNICODE 字符串或者宽字节字符串。L"中文123"
(占10字节)

1.5 字符集与编码

各个国家和地区所制定的不同 ANSI 编码标准中,都只规定了各自语言所需的“字符”。比如:汉字标准(GB2312)中没有规定韩国语字符怎样存储。这些 ANSI 编码标准所规定的内容包含两层含义:
使用哪些字符。也就是说哪些汉字,字母和符号会被收入标准中。所包含“字符”的集合就叫做“字符集”。
规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节来存储,这个规定就叫做“编码”。
各个国家和地区在制定编码标准的时候,“字符的集合”和“编码”一般都是同时制定的。因此,平常我们所说的“字符集”,比如:GB2312, GBK, JIS 等,除了有“字符的集合”这层含义外,同时也包含了“编码”的含义。

“UNICODE 字符集”包含了各种语言中使用到的所有“字符”。用来给 UNICODE 字符集编码的标准有很多种,比如:UTF-8, UTF-7, UTF-16, UnicodeLittle, UnicodeBig 等。


参考:http://www.regexlab.com/zh/encoding.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章