经常用到的编码

1.ASCII码:

我们知道在计算机中,所有信息最终会被表示为一个二进制的字符串。一个字节(byte)有八个二进制位,因此一个字节就有256个不同的状态,

分别从00000000到11111111。美国将英语字符和二进制位之间的关系做了统一的规定,这就是ASCII码。

ASCII码一共规定了127个字符,从0×00~0x7f。ASCII字符集包括英文字母、阿拉伯数字和标点符号等字符。其中0×00-0×20和0x7F共33个控制字符。

可以表示为\x加上十六进制的数字来表示,比如:”\x50”  是P,”\x40”是@,参考ASCII码表

 

2.gbk2312

  ASCII的最大缺点是只能显示26个基本拉丁字母、阿拉伯数目字和英式标点符号,因此只能用于显示现代美国英语。

  天朝专家把那些127号之后的奇异符号们(即EASCII)取消掉,规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,

就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,

这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,还把数学符号、罗马希腊的 字母、日文的假名们都编进去了,

连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在127号以下的那些就叫”半角”字符了。

GB2312(Gb2312简体中文编码表)的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。

对于人名古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBKGB 18030汉字字符集的出现。GBK是对GB2312的扩展.

 

3.ANSI

  在很多时候ANSI是默认的编码方式。对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对Windows简体中文版,如果是繁体中文版会采用Big5码)。

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

(这个再看到后面unicode就会知道了)。 对于ANSI编码而言,0×00~0x7F之间的字符,依旧是1个字节代表1个字符。这一点是ANSI编码与Unicode(UTF-16)编码之间最大也最明显的区别。

 

4.Unicode

Unicode编码系统为表达任意语言的任意字符而设计。它使用4字节的数字来表达每个字母、符号,或者表意文字(ideograph)。每个数字代表唯一的

至少在某种语言中使用的符号。

(并不是所有的数字都用上了,但是总数已经超过了65535,所以2个字节的数字是不够用的。)被几种语言共用的字符通常使用相同的数字来编码。

每个字符对应一个数字,每个数字对应一个字符。即不存在二义性。U+0041总是代表’A',即使这种语言没有’A'这个字符。

其表现形式为:\u3000, U+0041,汉字“严”的unicode是十六进制数4E25等(其为16进制)

 

5.utf-8

UTF-8就是在互联网上使用最广的一种unicode的实现方式。

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

也是一种前缀码。它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容。

UTF-8使用一至四个字节为每个字符编码:

  1. 128个US-ASCII字符只需一个字节编码(Unicode范围由U+0000至U+007F)。
  2. 带有附加符号拉丁文希腊文西里尔字母亚美尼亚语希伯来文阿拉伯文叙利亚文它拿字母则需要二个字节编码(Unicode范围由U+0080至U+07FF)。
  3. 其他基本多文种平面(BMP)中的字符(这包含了大部分常用字)使用三个字节编码。
  4. 其他极少使用的Unicode辅助平面的字符使用四字节编码。

缺点

  因为每个字符使用不同数量的字节编码,所以寻找串中第N个字符是一个O(N)复杂度的操作 — 即,串越长,则需要更多的时间来定位特定的字符。

同时,还需要位变换来把字符编码成字节,把字节解码成字符。

6.html实体

  其实这已经不属于编码的范畴,但是由于在web开发中经常会用到,所以也把它们摆出来。

一些字符在 HTML 中拥有特殊的含义,比如小于号 (<) 用于定义 HTML 标签的开始。如果我们希望浏览器正确地显示这些字符,

我们必须在 HTML 源码中插入字符实体。

字符实体有三部分:一个和号 (&),一个实体名称,或者 # 和一个实体编号,以及一个分号 (;)。

要在 HTML 文档中显示小于号,我们需要这样写:&lt; (实体名称)或者 &#60;(实体编号);如果要显示空格,则:&nbsp;或者&#160;。参考html实体

 

PS:下面将在前端开发中经常出现的一些编码情况拿出来分析下:

(1.)codeURIComponent(“http://cang.baidu.com/do/s?word=百度&ct=21″)=>

“http%3A%2F%2Fcang.baidu.com%2Fdo%2Fs%3Fword%3D%E7%99%BE%E5%BA%A6%26ct%3D21″

 

encodeURI(“http://cang.baidu.com/do/s?word=百度&ct=21″) =>

http://cang.baidu.com/do/s?word=%E7%99%BE%E5%BA%A6&ct=21

 

encodeURIComponent(“编 码 表”) => %E7%BC%96  %E7%A0%81  %E8%A1%A8

encodeURIComponent(“?”) => %3F

        请注意 encodeURIComponent() 函数 与 encodeURI() 函数的区别之处,前者假定它的参数是

URI 的一部分(比如协议、主机名、路径或查询字符串)。因此 encodeURIComponent() 函数将转义用于分隔 URI 各个部分的标点符号。

encodeURI不会解析除了参数之外的东西

 

(2.)escape对0-255以外的unicode值进行编码时输出%u****格式,其它情况下escape,encodeURI,encodeURIComponent编码结果相同。

如:escape(“宋德福”) => “%u5B8B%u5FB7%u798F”

console.log(“\u5B8B\u5FB7\u798F”) => 宋德福

decodeURIComponent(“%51″)   => Q

console.log(“\x51″) => Q

 

escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z

encodeURI不编码字符有82个:!,#,$,&,’,(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z

encodeURIComponent不编码字符有71个:!, ‘,(,),*,-,.,_,~,0-9,a-z,A-Z

posted @ 2012-05-16 23:47  沙漠孤鹰1140  阅读(302)  评论(0编辑  收藏  举报