爱米*阅

不是日志,不是剪切板

编码那些事 - [技术 | Tech]

发布时间   2011-01-17 @ 22:32:09 标签    javascript charset 编码 ajax 编辑 | 分享 0

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://www.blogbus.com/amixyue-logs/100159732.html

编码常识

你的电脑的操作系统本身会有编码。在 linux 下可以用 locale 命令查看,windows 下进入 cmd ,使用 systeminfo 查看系统信息。

新建文件,如用 notepad ,或其他编辑软件如 ultraEditor emEditor 等,对于新建文件和保存文件,都会设置编码,而这只是对文件内容的编码。文件名会按照系统编码写入。

通过程序读取、或者写入文件时,都需要选择编码的;否则就会乱码。

乱码者,必然是因为输入和输出时,使用编码不同所导致的。

编码者,character encoding , character set , character map , code page,就是字符到比特串(进而数字串)的映射。常用的编码有 ASCII , EBCDIC(Extended Binary Coded Decimal Interchange Code) , ISO 8859 ,  MS-Windows character sets(ANSI) , Mac OS Roman , GB(Chinese Guobiao) , Unicode 。

值得一说的是 Unicode 这种可以活跃在很多地方的编码方式。在 Unicode 中,CodePoint is for Char ,而 Codepoint 是由 Code unit 组成的。 Unicode 是编码规范,如 UTF-8 UTF-16 UTF-32 等都是其实现

Unicode 不兼容 gbk 滴!中国人民有点悲剧。

UTF-8 被使用得很频繁。把 Unicode 散列到 UTF-8 序列上去即可。

Web App 中编码

在 Web App 中,还需要明确以下几点:

1、js 引擎是 unicode;

2、URL编码是将字符裸码以16进制显示出来,每个字之前冠以“%”;URL编码的结果只唯一和字符当前存储的裸码有关,原则上转换过程不查任何码表;

3、unicode码表中,中文字符的范围为4E00到9FA5;

如:

要在js中模拟php中的json_encode只对中文进行unicode编码,则需要遍历字符串,用escape作转换,然后替换没用的字符

//js中只对中文进行unicode编码
var foo =  function(s){
    return s.replace(/[\u4E00-\u9FA5]/ig,function(w){
        return escape(w).toLowerCase().replace(/%/ig,'\\');
    });
};

若对所有字符进行unicode编码,则直接escape就可以了

4、js所识别的unicode表示形式为“\uXXYY”;

5、js中的encodeURI是对字符串进行URL编码,编码基于utf-8的裸码;

6、js中的escape是对字符串进行unicode转码,转码基于unicode码表;

如:

encodeURI('你')  ->"%E4%BD%A0"

escape('你') –> "%u4F60"

alert('\u4F60') –> “你”

7、form表单提交会对参数进行URL编码,编码所基于的裸码类型和页面编码有关;

在 Web App 中,涉及编码的点:服务器默认编码,文件存储编码,Accept-Charset,Content-Type:text/html; charset=UTF-8,浏览器宿主默认编码,浏览器编码,Js 引擎编码。

要求:

1、Get

文件新建编码 = 文件存储编码 = Content-Type:text/html; charset=xxx;

2、Ajax

UTF-8 & chr = utf8

3、form 采用隐藏的 iframe 提交。

其它相关小故事

话说 Java 最先为 TV 机顶盒项目语言,后来发展到很流行的网络编程语言。

话说 Netscape 最先有 liveScript ,米有市场的情况下,向 Java 购买了 Javascript 的商标,然后开始流行。

话说 Ms 对 Netscape 的 Javascript 很不满,于是也有了 JScript

话说 Netscape 为了生存,把 Javascript 拟成规范提交给了 Ecma 组织,就有了 EcmaScript 规范,从此 Javascript 只是实现 EcmaScript 的某个版本而已。

浏览器内核方,却辛苦了,既要照顾 W3c 的Dom 标准,又要照顾 EcmaScript 标准。因此既要有解析引擎,还得有 Js 引擎。

1995年,java applet 问世,改变了整个页面刷新这件令人失望的事情,接着 IE 推出了 Iframe,于 1999年,又推出了 XMLHTTP ActiveX control 在 IE5,这被 Mozilla Sfari Opera 等 Copy 为 XMLHttpRequest object,在 IE7 问世时,XMLHttpRequest 对象又被 IE7 Copy了。Google 在 Gmail & Gmap中大量使用了 Ajax ,这大力推广了 Ajax 应用。直到 2006年, W3c 认定了 XMLHttpRequest 。在 Jesse James Garrett 的 Adaptive path 中,有当年的 Ajax essay 可以参考。

后起者又 Json,Javascript Object Notation,被老道(Douglas Drockford)推出于 Javascript ,后来变成 language-independent 后被广泛使用,2009年被 Ecma 组织用于 EcmaScript V5 规范。2002年起,被老道注册的 json.org 上,你可以找到最全面的 Json 信息。

Javascript 日渐主流。动态语言,也日渐主流。

动态语言。一方面,变量类型在运行过程中不固定;另一方面,类型结构在运行过程中不固定。

现阶段,Java6 中增加了Compiler ,就可以 hack ,如在运行阶段添加新类;C# v4中,也增加了 var 等关键字。

一路走来,程序员要 care的事情越来越少,或者也越来越多,取决于你的态度。高端的自然会更高端,低端自然也会更低端。

分享到: