字符编码

ASCII

ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)

产生

在计算机中,所有的数据在存储和运算时都要使用二进制数表示,例如,像a、b、c、d这样的52个字母(包括大写)、以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,为了在互相通信中不造成混乱,就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。

格式

ASCII 码使用指定的7位或8位二进制数组合来表示128或256种可能的字符

  • 0~31及127(共33个)是控制字符或通信专用字符(0000 1101 13是回车)
  • 32~126(共95个)是字符(0010 0000 32是空格)
  • 48~57为0到9十个阿拉伯数字。
  • 65~90为26个大写英文字母
  • 97~122号为26个小写英文字母,其余为一些标点符号、运算符号等
  • 其最高位(b7)用作奇偶校验位。
  • 后128个称为扩展ASCII码。扩展ASCII码允许将每个字符的第8位用于确定附加的128个特殊符号字符、外来语字母和图形符号。

MBCS

为了扩充ASCII编码,以用于显示本国的语言,不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码,又称为"MBCS(Muilti-Bytes Charecter Set,多字节字符集)"

GB2312

GB2312 是ANSI编码里的一种,对ANSI编码最初始的ASCII编码进行扩充,为了满足国内在计算机中使用汉字的需要,中国国家标准总局发布了一系列的汉字字符集国家标准编码,统称为GB码,或国标码。

GB2312格式

GB2312编码用两个字节(8位2进制)表示一个汉字,所以理论上最多可以表示256×256=65536个汉字。但这种编码方式也仅仅在中国行得通,如果您的网页使用的GB2312编码,那么很多外国人在浏览你的网页时就可能无法正常显示,因为其浏览器不支持GB2312编码。

GBK

GBK即汉字内码扩展规范,K为扩展的汉语拼音中“扩”字的声母。英文全称Chinese Internal Code Specification。GBK编码标准兼容GB2312

GBK格式

GBK采用双字节表示,总体编码范围为8140-FEFE,首字节在81-FE 之间,尾字节在40-FE 。

Unicode

Unicode是一种在计算机上使用的字符编码。Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换处理的要求。这样就可以解决之前提到的不用编码间显示乱码问题。

但是Unicode只是规定了唯一的编码,但是编码方式是多样的。ASCII表示的字符使用UNICODE并不高效,因为UNICODE比ASCII占用大一倍的空间,而对ASCII来说高字节的0对他毫无用处。为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即UTF(Universal Transformation Format)。常见的UTF格式有:UTF-7, UTF-7.5, UTF-8,UTF-16, 以及 UTF-32。

UTF-8

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码

UTF-8格式

琪 (0111-0100-0010-1010)

  • ANSI: "E7 F7" 这就琪的GB2312编码 是采用大头方式存储的
  • Unicode:"FF FE 2A 74" 其中FF FE表明使用小头方式存储,整整的编码是742A
  • Unicode big endian: "FE FF 74 2A" 其中FE FF表明是大头方式存储
  • UTF-8:"EF BB BF E7 90 AA" 其中EF BB BF 表示uft-8存储

从"琪"的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0
(1110xxxx 10xxxxxx 10xxxxxx)--utf8->(11100111-10010000-10101010)--16进制->E790AA

大头与小头存储(Big endian / Little endian)

小端(低尾端):是指数据的高字节保存在内存的高地址中,而数据的低字节,保存在内存的低地址中
大端(高尾端):是指数据的高字节保存在内存的低地址中,而数据的低字节,保存在内存的高地址中

个人记忆:大端也就是高尾端,就是尾端放在高地址..比如12345678中 78显然是字符的尾段 则12 34 56 78 (低地址-->高地址)这样看起来很正常的排列就是大端..而78 56 34 12 (低地址-->高地址)这种尾段在低地址 看起来很别扭的方式就是小端..

原帖链接:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

posted @ 2015-08-18 09:51  Dyakria  阅读(235)  评论(0编辑  收藏  举报