前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >中文URL编码

中文URL编码

作者头像
用户1258909
发布2018-07-03 11:25:28
2.7K0
发布2018-07-03 11:25:28
举报
文章被收录于专栏:拂晓风起

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的编码转换”一文。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2010-05-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档