月度归档:2013年09月

Git branch, wonderful ! Even in windows,I love it. Thank you, Linus. BTW, git@oschina, very good!

堆操作 –python 描述

包含 堆建立,排序,插入,删除 等操作,支持最大推和最小堆

另外,python 标准库 中已有实现 from heapq import * 即可

AJAX Query Parameters Encoding

1 源起
   今天 写一个 chrome的 扩展程序, 结果 AJAX 提交的搜索总是搜索不到结果。调试了下,发现 AJAX传递过去的参数是UTF-8编码,而 网站使用的是 GBK。奇怪的是 如果 把 搜索的关键词 作为 URL 的一部分 是可以的。
 
2 AJAX
   设断点调试发现,JQuery 发送数据时,在 作为参数时 发送前 已使用 encodeURIComponent 转码。转码前的字符编码使用的是UTF-8字符集。而作为URL时,没有处理。接下来 交给 浏览器 API 处理。浏览器 收到后,发现网站使用的 GBK编码,于是 将 URL 从Unicode 转为 GBK 字符集,再 URLEncode 发送给服务器。
 
    为什么 发送的数据 要用 UTF-8 编码呢?查资料,看到 JQuery 对 ajax 的 contentType 参数 的 使用说明中写道:
 
  • contentType (default: 'application/x-www-form-urlencoded; charset=UTF-8')
    Type: String
    When sending data to the server, use this content type. Default is “application/x-www-form-urlencoded; charset=UTF-8”, which is fine for most cases. If you explicitly pass in a content-type to $.ajax(), then it is always sent to the server (even if no data is sent). The W3C XMLHttpRequest specification dictates that the charset is always UTF-8; specifying another charset will not force the browser to change the encoding.
 
   我试了下,即使 发送 charset=GBK 为 header 也不行。
   虽然 网站 使用 的 GBK,但搜索用GET 和 POST 都可以,问题已经解决。
 
   有意思的是,以前遇到的编码问题 都是 响应数据时 指定编码的问题。但这次是 请求数据,第一次遇到。
   我们在提交表单时 会用enctype属性来指定 content-type,但并没有指定 编码字符集。浏览器自动按照显示所使用的字符集处理。并且没有 在 Content-type 字段中 指定使用的什么编码。也就是 接受方 并不知道 发送的数据采用的什么字符集。这个前提就是 我们 首先 GET 一个 网页,再 根据 惯例一致 的原则 从一个网页 知道 这个网站采用的什么编码,在接下来的访问中都是用该字符集。
 
3 XMLHttpRequest
 
    通过 原始的 XMLHttpRequest 对象 ,抓包 发现 open 方法 会对 url 参数 使用 urlencode 编码,字符集 采用 浏览器当前网页使用的字符集,而 send 方法 对 参数 使用 utf-8 字符集编码,不做其他 比如 urlencode 处理。发送的 content-type 的header 字段 对 send的数据 编码 没有影响。 这一点 和 JQuery 解释的 一样。
  不同的时, 如果 是 网页中的表单,浏览器会 根据 enctype 和 网页使用的字符集 处理。
   为什么, ajax 不是 同样的方式了?
   查了一下 Level 2, 有一个 FormData 对象, 就是 用来 AJAX的,send一个formdata 自动 使用 multipart/form-data的content-type。可抓包一看, 仍然 使用 UTF-8 编码 发送的数据,content-type字段 也没有指明 charset。连 X-Requested-With 头都没有。不能区分 AJAX 和 正常 表单提交。
   这个是为什么了?为什么呢? 为什么 单单 AJAX 非要 限定 UTF-8?既然限定,为什么meta 还要设置  charset,统一UTF-8不更好。
 
4 感想
   浏览器本身是支持多字符集。强烈推荐 浏览器将 原生 字符集编解码API开放,W3C组织规范 API行为。
   HTTP 协议 真的 很老。总是 感觉 不方便。解码来,解码去。。。。没意思
  
 
References:
   w3c xmlhttprequest : http://www.w3.org/TR/XMLHttpRequest