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

Javascript encodeURIComponent根据环境的不同进行不同的编码,javascript,Javascript,我使用以下方式通过url传递对象: encodeURIComponent(JSON.stringify(myObject)) “ä”在我的本地服务器上编码为“%C3%A4”。 不幸的是,它在Web服务器上被编码为“a%CC%88” 这会破坏我的应用程序,因为它是数据库字段名称的一部分,编码错误时找不到该字段。我无法控制字段名中是否没有ä,因为该应用程序允许用户上传自己的数据 如何确保“ä”的编码始终正确 对不起。要明确这一点:编码在浏览器的客户端上同时发生。但是当web应用程序由web服务器

我使用以下方式通过url传递对象:

encodeURIComponent(JSON.stringify(myObject))
“ä”在我的本地服务器上编码为“%C3%A4”。 不幸的是,它在Web服务器上被编码为“a%CC%88”

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

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


对不起。要明确这一点:编码在浏览器的客户端上同时发生。但是当web应用程序由web服务器提供时,“ä”被编码为“%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>
按预期给出:$(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服务器(在cloudant.com上运行的couchapp)提供web应用程序时,问题才会出现


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

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

encodeURIComponent("ä") //%C3%A4"
decodeURIComponent("%C3%A4") //ä
因此,基本上“%C3%A4”应该是预期的输出

我认为这里的问题可能是
encodeURIComponent
需要
UTF-8
编码,而您的服务器端语言返回的不是这个


只是后续跟进,以防以后有人遇到此问题

这似乎是我的couchapp所在的cloudant.com所独有的

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


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

U+0061拉丁文小写字母A字符 U+0308组合分离特征(̉)

而不是

U+00E4带分音符的拉丁文小写字母A(ä)

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


这对我来说不再是一个问题,因为我改用了一个运行在digitalocean.com上的虚拟服务器,上面有香草couchdb(我对此非常满意)

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

谢谢你的大力帮助


Alex

您的服务器端语言是什么?在数据库列名中使用变音符号首先是在自找麻烦。似乎这可能是UTF-8问题@jasonsylvia的问题恰到好处。您的环境可能被设置为不同的语言。您确定字符是
ä
\u00e4
)而不是
a\u0308
?@jasonslyvia:实际上,这不是在服务器上运行,而是在浏览器(chrome)的客户端上运行。我不明白为什么只有当浏览器中运行的代码由Web服务器而不是本地计算机提供服务时才会出现问题。谢谢您的帮助,我非常感谢!请看一看扩展问题
encodeURIComponent("ä") //%C3%A4"
decodeURIComponent("%C3%A4") //ä