encodeURIComponent根据环境的不同进行编码

时间:2013-09-12 15:10:46

标签: javascript

我通过网址传递一个对象:

encodeURIComponent(JSON.stringify(myObject))

“ä”在我的本地服务器上编码为“%C3%A4”。 不幸的是,它在网络服务器上被编码为“a%CC%88”。

这打破了我的应用程序,因为它是数据库字段名称的一部分,在编码错误时找不到。我无法控制字段名称中没有ä,因为该应用程序允许用户上传自己的数据。

如何确保“ä”始终正确编码?


SORRY。为了清楚起见:编码在浏览器的客户端发生。但是当网络应用程序从网络服务器提供时,“ä”被编码为“%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')=Artnamevollständig

如果在循环时,我运行:

console.log('encodeURIComponent("Artname vollständig") = ' + encodeURIComponent("Artname vollständig"));

答案是正确的:encodeURIComponent(“Artnamevollständig”)= Artname%20vollst%C3%A4ndig

但如果我跑:

console.log("encodeURIComponent(this.getAttribute('feld')) = " + encodeURIComponent(this.getAttribute('feld')));

答案是:encodeURIComponent(this.getAttribute('feld'))= Artname%20vollsta%CC%88ndig

这在浏览器中发生。但是,当网络应用程序从web服务器(在cloudant.com上运行的couchapp)提供时,问题才出现。

“getAttribute”方法如何返回不同的编码?

2 个答案:

答案 0 :(得分:0)

以下代码已在Chrome 29 OS X,IE 8 Windows XP上测试过。

encodeURIComponent("ä") //%C3%A4"
decodeURIComponent("%C3%A4") //ä

所以基本上“%C3%A4”应该是预期的输出。

我认为此处的问题可能是encodeURIComponent需要UTF-8编码,而您的服务器端语言会返回除此之外的其他内容。

encodeURICompoent - MDN

答案 1 :(得分:0)

如果有人稍后遇到此问题,请进行跟进。

对于我的couchapp托管的cloudant.com来说,这似乎是独一无二的。

这是我从他们非常有用的支持中得到的答案:


好的 - 我想我找到了罪魁祸首。问题在于,由于内部优化(CouchDB中不存在),unicode字符串的形式可能会发生变化。在这种情况下,ä表示为:

U + 0061 LATIN SMALL LETTER一个角色 U + 0308组合DIAERESIS字符(̈)

而不是

U + 00E4带有DIAERESIS字符的拉丁文小写字母(ä)

两者在语义上是等价的,因此修复是在比较之前规范化unicode字符串。不幸的是,JavaScript没有内置的unicode规范化,但你可以使用像ashttps这样的库://github.com/walling/unorm。


当我改为使用vanilla couchdb在digitalocean.com上运行的虚拟服务器时,这对我来说不再是一个问题(我非常满意)。

但是我认为这可能会影响其他人用德语或其他语言开发couchapps需要utf8并在cloudant.com上托管它们

感谢您的大力帮助。

亚历

相关问题