我有一个 Javascript 小书签,它使用 encodeURIcomponent
将当前页面的 URL 传递给服务器端,然后在服务器端使用 urldecode
获取字符回来。
问题是,当编码字符不是 utf-8(对于我的情况是 gb2312,但它可能是其他东西)时,当服务器执行 urldecode
时,解码字符变成正方形。这显然不是编码前的样子。
这是一个小书签,输入可以是任何东西,所以我不能只在 js 中定义“编码为 gb2312”,或者在 php 脚本中定义“解码为 gb2312”。
那么,是否有一种正确的方法使用 encodeURIcomponent
将字符编码与内容一起传递,然后解码可以选择正确的编码对其进行解码?
最佳答案
关于浏览器的编码,尤其是GB2312字符集,先查看以下文档(中文)
- http://ued.taobao.com/blog/2011/08/26/encode-war/
- http://www.ruanyifeng.com/blog/2010/02/url_encoding.html
对于您的情况,%C8%B7%B6%A8
实际上是从 '\u786e\u5b9a'
的 GB2312 格式生成的。当用户直接在地址栏中输入汉字时,这通常发生在(旧版?)IE 和 FF 版本上,
或者您使用的是来自页面内容的非标准链接,它根本不执行 IRI 到 URI 编码,只是呈现二进制字符串,如 不太确定,因为无法在 Chrome 中重现,也许在 FF 中测试和IE,关于 bean 瓣的部分是真实的。 '/tag/\xc8\xb7\xb6\xa8'
(douban.com 以前对标签有这种用法,现在他们使用正确的 URI 编码 UTF8)。
实际上,encodeURIComponent
的正确输出应该是
> encodeURIComponent('%C8%B7%B6%A8')
"%25C8%25B7%25B6%25A8"
因此在服务器端,当未加引号的字符串包含非 ascii 字节时,您最好保留字符串原样,此处 '%C8%B7%B6%A8'
。
此外,您可以检查客户端以在包含 %XX
的值上再次应用 encodeURIComponent
,其中 XX 大于 0x7F
。不过,我不太确定这是否符合 RFC 2396。
写英文好累啊,不过还是要入乡随俗~
关于javascript - 编码 URIcomponent 非 utf-8 字符并相应解码它们的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10362138/