0

次を使用して、URL経由でオブジェクトを渡しています。

encodeURIComponent(JSON.stringify(myObject))

「ä」はローカル サーバーで「%C3%A4」としてエンコードされます。残念ながら、ウェブサーバーでは「a%CC%88」としてエンコードされています。

これは、誤ってエンコードされたときに見つからないデータベース フィールドの名前の一部であるため、アプリが壊れます。また、アプリではユーザーが自分のデータをアップロードできるため、フィールド名に ä がないことを制御できません。

「ä」が常に正しくエンコードされていることを確認するにはどうすればよいですか?


ごめん。これを明確にするために: エンコーディングは、ブラウザのクライアント側で両方とも行われます。ただし、Web アプリが Web サーバーから提供される場合、「ä」は「a%CC%88」ではなく「%C3%A4」としてエンコードされます (同じ 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」が異なるエンコーディングを返すのはどうしてでしょうか?

4

2 に答える 2

0

誰かが後でこの問題に遭遇した場合に備えて、フォローアップしてください。

私のcouchappがホストされていたcloudant.comに固有のようです。

これは、非常に役立つサポートから得た答えです。


OK - 犯人を見つけたと思います。問題は、内部の最適化 (CouchDB には存在しない) により、Unicode 文字列の形式が変更される可能性があることです。この場合、ä は次のように表されます。

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

それ以外の

U+00E4 分音符号付きラテン小文字 A (ä)

どちらも意味的には同等であるため、修正は比較の前にユニコード文字列を正規化することです。残念ながら、JavaScript には Unicode の正規化機能が組み込まれていませんが、https://github.com/walling/unorm などのライブラリを使用できます。


バニラのcouchdbを使用してdigitalocean.comで実行されている仮想サーバーに変更したため、これはもう問題ではありません(そして非常に満足しています)。

しかし、これは、utf8 を必要とするドイツ語やその他の言語でカウチアプリを開発し、cloudant.com でホストしている他のユーザーに影響を与える可能性があると思います。

大変お世話になりました。

アレックス

于 2013-11-26T10:13:23.467 に答える
0

次のコードは、Chrome 29 OS X、IE 8 Windows XP でテストされています。

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

したがって、基本的に「%C3%A4」が期待される出力になるはずです。

ここでの問題は、サーバー側の言語がこれ以外のものを返すときにエンコードがencodeURIComponent必要になる可能性があると思います。UTF-8

encodeURICompoent - MDN

于 2013-09-13T01:48:00.387 に答える