javascript - 编码 URIcomponent 非 utf-8 字符并相应解码它们的正确方法是什么?

标签 javascript utf-8 urldecode encodeuricomponent

我有一个 Javascript 小书签,它使用 encodeURIcomponent 将当前页面的 URL 传递给服务器端,然后在服务器端使用 urldecode 获取字符回来。

问题是,当编码字符不是 utf-8(对于我的情况是 gb2312,但它可能是其他东西)时,当服务器执行 urldecode 时,解码字符变成正方形。这显然不是编码前的样子。

这是一个小书签,输入可以是任何东西,所以我不能只在 js 中定义“编码为 gb2312”,或者在 php 脚本中定义“解码为 gb2312”。

那么,是否有一种正确的方法使用 encodeURIcomponent 将字符编码与内容一起传递,然后解码可以选择正确的编码对其进行解码?

最佳答案

关于浏览器的编码,尤其是GB2312字符集,先查看以下文档(中文)

对于您的情况,%C8%B7%B6%A8 实际上是从 '\u786e\u5b9a' 的 GB2312 格式生成的。当用户直接在地址栏中输入汉字时,这通常发生在(旧版?)IE 和 FF 版本上,
或者您使用的是来自页面内容的非标准链接,它根本不执行 IRI 到 URI 编码,只是呈现二进制字符串,如 '/tag/\xc8\xb7\xb6\xa8'(douban.com 以前对标签有这种用法,现在他们使用正确的 URI 编码 UTF8)。 不太确定,因为无法在 Chrome 中重现,也许在 FF 中测试和IE,关于 bean 瓣的部分是真实的。

实际上,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/

相关文章:

unicode - 如何在 Lisp(sbcl+slime) 中打开名称包含 unicode 代码的文件?

mysql - HTML - 来自数据库的英镑符号显示为?即使使用 charset=UTF-8

awk - AWK 中的 URL 解码

php - 如何从js代码中获取字符串值

php - 更改 MySQL、PHP 脚本、HTML 中的字符编码

php - JS/PHP交叉url编码和url编码

javascript - 可以从 Javascript(Chrome 扩展)访问亚马逊产品 API

javascript - 选中/取消选中复选框列表中的所有项目时的奇怪行为

javascript - 如何在 Backbone 中使用 setTimeout()?

javascript - 改变平面三 Angular 形的颜色 threeJS