encodeURIComponent 的编码方式因环境而异
encodeURIComponent encodes differently, depending on environment
我正在使用以下内容通过 url 传递一个对象:
encodeURIComponent(JSON.stringify(myObject))
"ä"在我的本地服务器上编码为"%C3%A4"。不幸的是,它在网络服务器上被编码为"a%CC%88"。
这会破坏我的应用程序,因为它是数据库字段名称的一部分,在错误编码时找不到。而且我无法控制字段名称中没有 ä,因为该应用程序允许用户上传自己的数据。
如何确保"ä"始终正确编码?
不好意思。为了明确这一点:编码在浏览器中的客户端发生两次。但是当网络应用程序从网络服务器提供时,"ä"被编码为"%C3%A4"而不是"a%CC%88"(我已经在同一个 chrome 浏览器中测试了两者)
感谢您的帮助。它让我更深入地挖掘:
我有在事件上运行的代码。它循环遍历复选框并创建一个包含(也)字段名称的对象数组。该代码从复选框的名为"feld"的属性中获取字段名称:
<div class="checkbox">
<label>
<input class="feld_waehlen" type="checkbox" dstyp="Taxonomie" datensammlung="SISF Index 2 (2005)" feld="Artname vollständig">Artname vollständig
</label>
</div>
运行此代码:
console.log("this.getAttribute('feld') = " + this.getAttribute('feld'));
按预期给出: $(this).attr('feld') = Artname vollständig
如果在循环时,我运行:
console.log('encodeURIComponent("Artname vollständig") = ' + encodeURIComponent("Artname vollständig"));
答案是正确的:encodeURIComponent("Artname vollständig") = Artname%20vollst%C3%A4ndig
但是如果我运行:
console.log("encodeURIComponent(this.getAttribute('feld')) = " + encodeURIComponent(this.getAttribute('feld')));
答案是:encodeURIComponent(this.getAttribute('feld')) = Artname%20vollsta%CC%88ndig
这一切都发生在浏览器中。但仅当 Web 应用程序从 Web 服务器(在 cloudant.com 上运行的沙发应用程序)提供服务时,问题才会出现。
方法"getAttribute"怎么会返回不同的编码?
以下代码已在Chrome 29 OS X,即8 Windows XP上进行了测试。
encodeURIComponent("ä") //%C3%A4"
decodeURIComponent("%C3%A4") //ä
所以基本上"%C3%A4"应该是预期的输出。
我认为这里的问题可能是encodeURIComponent
需要UTF-8
编码,而您的服务器端语言返回其他内容。
encodeURICompoent - MDN
只是一个后续,以防以后有人遇到这个问题。
这似乎是我的沙发应用程序托管 cloudant.com 独有的。
这是我从他们非常有用的支持中得到的答案:
好吧 - 我想我已经找到了罪魁祸首。问题是,由于内部优化(CouchDB中不存在),Unicode字符串的形式可能会改变。在这种情况下,ä 表示为:
U+0061 拉丁小写字母 A 字符U+0308 组合诊断字符 (̈)
而不是
U+00E4 拉丁小写字母 A,带 diaeresis 字符 (ä)
两者在语义上是等效的,因此解决方法是在比较之前规范化 unicode 字符串。不幸的是,JavaScript 没有内置的 unicode 规范化,但您可以使用这样的库 ashttps://github.com/walling/unorm。
这对我来说不再是问题,因为我改用了在带有香草 couchdb 的 digitalocean.com 上运行的虚拟服务器(并且对此非常满意)。
但我确实认为这可能会打击其他人用德语或其他需要 utf8 的语言开发沙发应用程序并将它们托管在 cloudant.com
感谢您的大力帮助。
亚历克斯
- 为什么这在IE中的工作方式与在Firefox中不同
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- 在localhost Dev Box上测试JSONP请求的最佳方式
- 使用javascript存储变量的最安全方式
- 难以访问的JS环境中的语法错误
- 以可优化的方式使用requirejs加载模板
- 在Highcharts中,我们可以通过任何方式在渲染图表之前获得plotWidth和plotHeight
- 任何方式使AJAX调用Gmail API,而无需通过JS库
- 为react组件传递道具的最佳方式
- 应用脚本的绑定方式因输入源而异
- js 函数的行为因调用方式而异
- Javascript 对象属性值因显示方式而异
- encodeURIComponent 的编码方式因环境而异
- 确保内容在有时间限制的环境中随时可用的最佳方式
- Javascript 范围因传递回调函数的方式而异
- 什么是正确的方式来写我的脚本'src'本地开发环境的Url
- 如何以跨平台方式设置环境变量
- JavaScript:在页面初始化时加载应用程序环境变量的最佳方式是什么
- 需要安全的方式在web环境的服务器上解释和执行用户定义的逻辑