0

我通过 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%20volst%C3%A4ndig

但是如果我运行:

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

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

这一切都发生在浏览器中。但问题仅在从网络服务器(在 cloudant.com 上运行的沙发应用程序)提供网络应用程序时出现。

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

4

2 回答 2

0

以下代码已在 Chrome 29 OS X、IE 8 Windows XP 上进行了测试。

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

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

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

编码URICompoent - MDN

于 2013-09-13T01:48:00.387 回答
0

只是一个跟进,以防以后有人遇到这个问题。

它似乎是托管我的 couchapp 的 cloudant.com 独有的。

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


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

U+0061 LATIN SMALL LETTER A 字符 U+0308 COMBINING DIAERESIS 字符 (̈)

代替

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

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


这对我来说不再是问题了,因为我改为使用 vanilla couchdb 在 digitalocean.com 上运行的虚拟服务器(并且对此感到非常满意)。

但我确实认为这可能会打击其他需要 utf8 的德语或其他语言开发 couchapps 并将它们托管在 cloudant.com 上的人

感谢您的大力帮助。

亚历克斯

于 2013-11-26T10:13:23.467 回答