8

JSONを出力するサーブレットがあります。サーブレットの出力エンコーディングはISO-8859-1です。WebアプリのページもISO-8859-1に設定されています。私はUTF-8を使用しますが、これは私の制御の範囲外です。ISO-8859-1を使用する必要があります。

サーブレットを単独でヒットすると、出力されたJSONデータを見ることができます。文字エンコードは正しく、どの文字も奇妙に見えません。

ただし、AJAXを介してサーブレットを呼び出し、取得したデータを使用して選択ボックスにデータを入力すると、アクセントのあるすべての文字の代わりに(たとえば、重度またはアキュートアクセント、分音記号、曲折アクセント記号付きの)文字が表示されます。 )。Firebugの下の[ネット]タブで応答を見ると、テキストが正常に表示されていることがわかります。ただし、そのデータを使用して選択ボックスにデータを入力すると、疑問のあるひし形が表示されます。

これらの文字はすべて有効なISO-8859-1文字であるため、正しく表示されない理由がわかりません。

編集

いくつかの詳細情報。で使用GETjQuery.ajax、に設定scriptCharsetしましたISO-8859-1。サーバー側では、を使用してエンコーディングをISO-8859-1に明示的に設定しましたrequest.setCharacterEncoding("ISO-8859-1");

編集

コードサンプル:

これは私が現在持っているものです。効果を追加scriptCharset: "ISO-8859-1"しませんでした。

        jQuery.ajax({
            url: "/countryAndProvinceCodeServlet",
            data: data,
            dataType: "json",
            type: "GET",
            success: function(data) {
               ...
            },
        });

私のサーブレットはorg.json.JSONObject、文字列を使用して出力します。response.getWriter().print(jsonObject.toString());

アップデート

dataTypeJSONとUTF-8についてのコメントによると、データをテキストとして取得して( textinに設定)、自分でJSONとして評価できるかどうかjQuery.ajax(Javascriptで)を確認しようとしました。それもうまくいかないようです!私がそうするときconsole.log、私はまだファンキーなダイヤモンドを手に入れます。ただし、Firebugの[ネット]タブで確認すると、すべてが正常に表示されます。

ネットタブ:

{"error":false,
 "provinces":{"DZ-01":"Adrar",
              "DZ-16":"Alger",
              "DZ-23":"Annaba",
              "DZ-44":"Aïn Defla",
              "DZ-46":"Aïn Témouchent",
              "DZ-05":"Batna",
              "DZ-07":"Biskra",
              "DZ-09":"Blida",
              "DZ-34":"Bordj Bou Arréridj",
              "DZ-10":"Bouira",
              "DZ-35":"Boumerdès",
              "DZ-08":"Béchar",
              "DZ-06":"Béjaïa",
              "DZ-02":"Chlef",
              "DZ-25":"Constantine",
              "DZ-17":"Djelfa",
              "DZ-32":"El Bayadh",
              "DZ-39":"El Oued",
              "DZ-36":"El Tarf",
              "DZ-47":"Ghardaïa",
              "DZ-24":"Guelma",
              "DZ-33":"Illizi",
              "DZ-18":"Jijel",
              "DZ-40":"Khenchela",
              "DZ-03":"Laghouat",
              "DZ-29":"Mascara",
              "DZ-43":"Mila",
              "DZ-27":"Mostaganem",
              "DZ-28":"Msila",
              "DZ-26":"Médéa",
              "DZ-45":"Naama",
              "DZ-31":"Oran",
              "DZ-30":"Ouargla",
              "DZ-04":"Oum el Bouaghi",
              "DZ-48":"Relizane",
              "DZ-20":"Saïda",
              "DZ-22":"Sidi Bel Abbès",
              "DZ-21":"Skikda",
              "DZ-41":"Souk Ahras",
              "DZ-19":"Sétif",
              "DZ-11":"Tamanghasset",
              "DZ-14":"Tiaret",
              "DZ-37":"Tindouf",
              "DZ-42":"Tipaza",
              "DZ-38":"Tissemsilt",
              "DZ-15":"Tizi Ouzou",
              "DZ-13":"Tlemcen",
              "DZ-12":"Tébessa"}}

しかし、私がconsole.log(text)得たものを使うとjQuery.ajax、次のようになります。

{"error":false,
 "provinces":{"DZ-01":"Adrar",
              "DZ-16":"Alger",
              "DZ-23":"Annaba",
              "DZ-44":"A�n Defla",
              "DZ-46":"A�n T�mouchent",
              "DZ-05":"Batna",
              "DZ-07":"Biskra",
              "DZ-09":"Blida",
              "DZ-34":"Bordj Bou Arr�ridj",
              "DZ-10":"Bouira",
              "DZ-35":"Boumerd�s",
              "DZ-08":"B�char",
              "DZ-06":"B�ja�a",
              "DZ-02":"Chlef",
              "DZ-25":"Constantine",
              "DZ-17":"Djelfa",
              "DZ-32":"El Bayadh",
              "DZ-39":"El Oued",
              "DZ-36":"El Tarf",
              "DZ-47":"Gharda�a",
              "DZ-24":"Guelma",
              "DZ-33":"Illizi",
              "DZ-18":"Jijel",
              "DZ-40":"Khenchela",
              "DZ-03":"Laghouat",
              "DZ-29":"Mascara",
              "DZ-43":"Mila",
              "DZ-27":"Mostaganem",
              "DZ-28":"Msila",
              "DZ-26":"M�d�a",
              "DZ-45":"Naama",
              "DZ-31":"Oran",
              "DZ-30":"Ouargla",
              "DZ-04":"Oum el Bouaghi",
              "DZ-48":"Relizane",
              "DZ-20":"Sa�da",
              "DZ-22":"Sidi Bel Abb�s",
              "DZ-21":"Skikda",
              "DZ-41":"Souk Ahras",
              "DZ-19":"S�tif",
              "DZ-11":"Tamanghasset",
              "DZ-14":"Tiaret",
              "DZ-37":"Tindouf",
              "DZ-42":"Tipaza",
              "DZ-38":"Tissemsilt",
              "DZ-15":"Tizi Ouzou",
              "DZ-13":"Tlemcen",
              "DZ-12":"T�bessa"}}

jQueryがデータに対して何か奇妙なことをしているように私には思えます。

4

6 に答える 6

17

私はついにそれを理解しました。かなり変です!

response.setCharacterEncoding(String)動作しませ(それが私のセットアップに関連しているかどうかはわかりません)。文字エンコードを設定しているように見えますが、何らかの理由でjQueryがすべてを台無しにしてしまいます。次のようにヘッダーを明示的に設定します。

response.setHeader("Content-Type", "application/json; charset=ISO-8859-1");

皆さん、助けてくれてありがとう!

編集

私はいくつかの調査を行い、JavaDocsをチェックして、これを見ました。

プロトコルがそうする方法を提供する場合、コンテナはサーブレット応答のライターに使用される文字エンコーディングをクライアントに伝達する必要があります。HTTPの場合、文字エンコードは、テキストメディアタイプのContent-Typeヘッダーの一部として伝達されます。サーブレットがコンテンツタイプを指定していない場合、文字エンコードはHTTPヘッダーを介して通信できないことに注意してください。ただし、サーブレット応答のライターを介して書き込まれたテキストをエンコードするために引き続き使用されます

したがって、上記は引き続き機能しますが、これを実行することもできます(おそらく実行する必要があります)。

response.setContentType("application/json");
response.setCharacterEncoding("ISO-8859-1"); 
于 2010-07-07T22:05:07.870 に答える
2

代わりにUTF-8を使用できますか?

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

PHPでは、JSONデータをUTF-8としてエンコードできます。

/**
 * Applies a UTF-8 encoding conversion for text.
 */
function utf8_enc( $rows ) {
  $encoded = array();

  foreach( $rows as $row ) {
    $temp = array();

    foreach( $row as $name => $value ) {
      $temp[ $name ] = $value = mb_convert_encoding( $value, 'auto', 'UTF-8' );
    }

    array_push( $encoded, $temp );
  }

  return $encoded;
}

function db_json( $query ) {
  echo json_encode( utf8_enc( db_fetch_all( db_query( $query ) ) ) );
}

ISO-8859-1アクセント付き文字セットを使用すると奇妙な結果が見られました。UTF-8に切り替えたところ、エンコーディングの問題は解消されました。

その価値について、私はgetJSON次のようにコーディングしました。

  $.getJSON( HOST + 'cat.dhtml', function( data ) {
    var h = '';
    var len = data.length;

    for( var i = 0; i < len; i++ ) {
      h += '<option value="' + data[i].id + '">' + data[i].name + '</option>';
      categories[ data[i].id ] = data[i];
    }

    $('#category').html(h);
  });
于 2010-07-07T20:43:23.603 に答える
2

応答データのデコードが間違っており、間違った文字が含まれているため、解析エラーが発生したようです。

jQuery.ajaxに追加のパラメーターを挿入してみることができます

dataFilter : function ( data, type ) {
    alert(data);
    return data;
}

すべての非ASCII文字('ï'、'é'など)に対して間違っているが異なるdataFilter文字がある場合は、間違ったエンコード文字を正しい文字に置き換えて、から正しいエンコードデータを返すことができます。

于 2010-07-07T22:25:33.890 に答える
1

RFC 4627は、JSONテキストはUnicodeでエンコードする必要があると述べており、json.orgは、すべての文字が「Unicode文字」であることを示しています。

  • エンコーディング

    JSONテキストはUnicodeでエンコードする必要があります。デフォルトのエンコーディングはUTF-8です。

    JSONテキストの最初の2文字は常にASCII文字[RFC0020]であるため、オクテットストリームがUTF-8、UTF-16(BEまたはLE)、またはUTF-32(BEまたはLE)のいずれであるかを判別できます。最初の4オクテットのnullのパターンを確認します。

       00 00 00 xx  UTF-32BE
       00 xx 00 xx  UTF-16BE
       xx 00 00 00  UTF-32LE
       xx 00 xx 00  UTF-16LE
       xx xx xx xx  UTF-8
    

したがって、JSONを転送してISO-8859-1であると言っている場合、さまざまなJSONライブラリがJSONを定義するRFCのSHALL句をさまざまな方法で解釈する可能性があります。たとえば、置換文字をエンコードしたり、エンコードをスニッフィングしたりします。明らかにこれをあなたのコントロールの外にあるものに持っていき、それを修正するように彼らに言うなら、最良の方法:-)

回避策

これを回避する1つの方法は、UTF-8とISO-8859-1の両方と互換性のないすべての文字を削除し、それらをJSONエスケープに置き換えるサーブレットフィルターを作成することです。

次のフラグメントで、「é」を「\ u00E9」に置き換えて、問題のあるISO-8859-1文字が同一の7ビットで安全に転送されるようにします。

前: { "a" : "éte" }

後: { "a" : "\u00E9te" }

読みやすくはありませんが、意味的には同じであり、優れたJSONライブラリはそれらを同じように扱う必要があります。

于 2010-07-07T21:13:55.157 に答える
0

php関数json_encodeは、ISO-8859-1でエンコードされたデータをサポートしていません。

この記事はあなたの問題に役立つかもしれません:http://www.pabloviquez.com/2009/07/json-iso-8859-1-and-utf-8-%E2%80%93-part2/

于 2010-07-07T20:50:17.713 に答える
0

データベースからデータを取得したい場合は、ajaxページからリクエストを送信するページの文の下にこれらを書き込む必要があります。たとえば、ページ「A」でHTMLおよびAJAXコードを記述し、Javaコードからページ「B」に変数を送信する場合、これらのコードをページ「B」に記述します。
データベースが「utf8_general_ci」などのUnicodeモードであることを忘れないでください。

mysqli_query ($conn,"set character_set_client='utf8'");
mysqli_query ($conn,"set character_set_results='utf8'");
mysqli_query ($conn,"set collation_connection='utf8_general_ci'");
mysqli_query($conn,"set collation_connection='utf8_persian_ci'");
mysqli_set_charset($conn,"set character_set_results='utf8'") ;
mysqli_set_charset($conn,"set collation_connection='utf8_general_ci'") ;

; 私はこれらの文をペルシア語で書きました、あなたはそれを修正することができます。$connMySQLのデータベース内の指定されたテーブルに接続するための変数です。

于 2015-12-21T21:07:42.400 に答える