2011-08-11 17 views
0

私のアプリケーションでは、私はtwitterからつぶやきを読みますが、つぶやきは言語に制限されていません。ですから、中国/日本のツイートの返信をしようとすると、コンテンツが正しく表示されません。私は現在、応答を送る前に多言語エンコードを処理する

response.setContentType("text/html;charset=UTF-8"); 

を設定しています。

複数の言語を処理するにはどうすればよいですか?私は、メッセージが

を送っ見ることができます

{ "lastPost":{ "最終更新日": "毋成金口"、 "pubDateの": "金8月12日午後12時39分09秒UTC 2011"、」 MESSAGE_ID:???? "" 101814948329562112}

これはJSON文字列であると応答に追加..

私のクライアントすなわちiphoneのlastpostです"

+1

UTF-8でメッセージのつぶやき自体をエンコードしないのはなぜあなたは一つだけのエンコーディングを持っているに設定されたのですか?私が知っている限り、httpサイトでエンコード自体を変更することはできないと思います。 – Voo

+0

ユーザー入力を正しくキャプチャしていますか?あなたはもう片面に何を見ていますか?サンプルのユーザー入力と表示された出力で質問を更新します。 – alphazero

答えて

1

ページがUTF-8であることをブラウザに伝えることは良いことですが、ページに実際にUTF-8だけを書いていることを確認しない限り、役に立たなくなります。

この問題が発生したことを確認するには:Twitterや何から、

  1. をお読みたびに、いつもあなたがUTF-8バイトを受けていることを確認し、UTF-8のデータを必要とします。
  2. 生のバイトから文字列を作成すると、Javaはデフォルトで「プラットフォームのデフォルトのエンコード」を使用します。バイト列から文字列への変換は、バイト配列かReaderを使用して新しいStringを作成するときに発生します。これらのメソッドを使用すると、バイトが必要とするエンコードを明示的に定義することができます。ポイント1がチェックされ、UTF-8バイスを受信すると、バイトを文字列に変換するときにUTF-8を使用するようアプリケーションのどこにでも指定してください。
  3. 文字列を例えばブラウザ(サーブレットライター)に送信されるバイトに変換する場合は、同じ規則が適用されます。明示的に指定して、常にUTF-8を指定してください。
  4. stuffをデータベースに格納する場合、 2つのエンコーディングの問題があります。最初のものは、アプリケーションに接続するとき(接続エンコーディング)にデータベースを使用してエンコードし、2番目がデータベースをエンコーディングするときに実際に文字列を格納します(ストレージエンコーディング)。通常、Javaからの接続エンコーディングのみを指定できますが、ストレージエンコーディングはデータベースの作成時に指定されます(mysqlを使用している場合は「照合」を検索します)。

UTF-8であるはずの文字列が悪く再エンコードされる場所を検出するのは難しい作業です。時間の99%は、ISOラテンやそれに類するエンコーディングに変換されているため、àやìのような特殊文字が2つの文字として表示されます。これがどこで起こるかを知るには、しばしばデバッグが唯一の方法です。

+0

2と3をより具体的にするために、 'new InputStreamReader(stream、encoding)'は良いですが、 'new InputStreamReader(stream)'と 'new FileReader(file)'は悪いです。同様に 'new OutputStreamWriter(stream、encoding)'は良いですが、 'new OutputStreamWriter(stream)'と 'new FileWriter(file)'は悪いです。あなたがデフォルトのエンコーディングを想定しているところでコード内のすべての場所を切り詰めようとしているなら、それらのパターンに対する 'grep'はローハンドのフルーツを集める良い方法です。 –

+0

Chrome拡張機能を使ってメッセージを取得しようとするとうまくいきます... iphoneクライアントの問題になるかもしれません。 – harshit

+0

@Mike:そのフォームのコンストラクタは使用しないでください! 4つの中で最長のものだけが使えます!そうしないと、エンコードエラーを検出できなくなります。これを行う正しい方法については、[このページ](http://training.perl.com/OSCON2011/index.html)の3回目のトークでスライド43をご覧ください。入力ストリームリーダは 'Charset.forName(" UTF-8 ")。newDecoder()'の第2のコンストラクタ引数を必要とし、出力ストリームライタは 'Charset.forName(" UTF-8 ")の第2引数を必要とします。 '。 – tchrist

0

問題は、クライアントの符号化方式とあった...それはISO-