来了 活了 爱了 - 杨余斌的个人主页

268 元 丰胸极限 美国魔力丰丰乳片mirifem
最火爆的丰胸品-美国魔力丰丰乳片mirifem

268 元 绝对NO1新版mirifem魔力丰丰胸片
美国顶级产品 畅销世界各地 强势登陆国内

156 元 消腩宝贝 快速瘦身 月减20斤
★★妙妙独家代理★★消腩宝贝★★速效减肥胶囊★月

中文URL编码

作者:杨余斌    来自: 加入时间:2007-Mar-08

终于自已想出了答案!!!希望朋友们以后遇到这样的问题可以得到解决。
因为我的网页是用gb2312作为字符集的,而url并没有作这样的限制。在linux与win底下的Apache服务器都可以对中文目录有很好的支持。http地址在linux下访问中文文件夹的url的格式是:
urlencode( '中国人');
而在win的服务器下访问中文目录的是:
echo urlencode(iconv("gb2312", "UTF-8", '中国人'))

 

URL编码是一个比较麻烦的事情,RFC 3986是关于URI的一个标准,在它的第2节定义了字符如何在URI中进行表示,而第3节把一个URI区分为scheme, hier-part, query, fragment几个component。根据这个RFC,A URI is composed from a limited set of characters consisting of digits, letters, and a few graphic symbols. 附录A中给出了ABNF定义。

比如URL,http://www.qingbo.org/?p=230#comments,就包含了上述的全部四个components。这个URL不需要进行百分号编码,因为每个component中都没有保留字,全部为字母、数字或者非保留的ASCII可见字符(见RFC 3986第2.3节)。

假设我们在Firefox中打开了这个URL,并且想通过del.icio.us的插件按钮把它收藏起来。del.icio.us插件打开一个新窗口,并通过GET方法向服务器发出请求,将这个URL和它对应的title作为query的参数传递给服务器,服务器就把这两个值填充到对应的input value属性中。

假如不经过编码,这个GET请求中的URL就是”http://del.icio.us/flimsy?url=http://www.qingbo.org/?p=230#comments&title=星月轮转 » Blog Archive » Blog换了个样子&noui&jump=close&v=4″。问题就出来了,#号后面的是什么呢?按理说应该解释为页面中的一个anchor,然而#comments只是url这个参数的一部分。另外,URL中含有汉字,也不符合标准。所以编码是必须的,要针对各个component,以及query中的每个参数值做percent encoding. 注意不是对整个URL(指del.icio.us的GET请求中的长URL)做,如果flimsy后面的问号被编码,服务器便不知道它后面是query部分了。正确编码后的链接应该是这样,很长,就不显示了,你可以复制链接地址来看看(似乎显示的时候浏览器又自动decode了,点击即可在地址栏看到编码后结果)

URL编码要求先将URL转换为一个UTF-8的字节序列,然后再做percent encoding, 这在RFC 3986和W3C的网站上都有介绍。在为Firefox做插件时,主要用Javascript实现程序逻辑,而Javascript中的字符串是UTF-8编码,且有一个方便的encodeURIComponent函数可以做URL编码。除此之外,还有escape/encodeURI两个函数。关于它们三个的比较,可参考这篇文章

如果没有现成的函数,对UTF-8字节序列进行percent encoding也是比较方便的。对于unreserved character值,不需要做转换,其它的字节全部用% HEXDIG HEXDIG来表示。另外空格除”%20″外,也可以转为”+”,节省空间。

一个非常重要的问题就是如何把字符(ASCII字符除外,主要是中文等)转换为UTF-8的字节序列。并不是每种语言都像Javascript那样方便,比如在C++中,你得到了一个含有中文的宽字符串,怎么处理呢?Win32 API中是有一个InternetCanonicalizeUrl函数,但它只针对一个字节序列,不会考虑中文的编码转换。在MSDN“规范的URL”定义中,”Characters that must be encoded”并没有提到宽字符的处理,甚至没有提到UTF-8. 它还要求字符串中必须包含一个scheme.

有时间的时候我会再写一篇关于怎么在Windows中把中文转换为UTF-8字节序列的文章,对进行中文URL编码的朋友也许会有帮助。见“GBK(GB2312)向UTF-8的编码转换”一文。


[声明]
    以上文章如果标明为杨余斌自创,在转载时必须注明出处,并且不得修改文章内容,和文章内的链接等。
    以上文章或资料除注明为杨余斌自创或编辑整理外,均为各方收集或网友推荐所得。其中摘录的内容以共享、研究为目的,不存在任何商业考虑。
    目前网站上有些文章未注明作者或出处,甚至标注错误,此类情况出现并非不尊重作者及出处网站,而是因为有些资料来源的不规范。如果有了解作者或出处的原作者或网友,请告知,本网站将立即更正注明,并向作者或出处单位道歉。
    被摘录的对象如有任何异议,请与本站联系,联系邮箱:webmaster at yangyubin.com,本站确认后将立即撤下。谢谢您的支持与理解
合作伙伴

999 元 海胆精-给男人动力,换女人激情
青岛海汇公司国家发明专利,具有滋阴补肾功能

Text Link Ads
Text Link Ads,注册就送100美元!




Copyright © 2006 www.yangyubin.com All rights reserved.
| Wind CMS 文章管理系统1.0 |