PHP中間層からJ2EEを理解するJavaバックエンドにパラメータを渡そうとしています。私はGroovyにコントローラコードを書いています。そこには、おそらく国際文字を含むいくつかのパラメータをデコードしようとしています。utf-8をJavaでデコードする
これまでのところ、この問題をデバッグした結果に本当に困惑しています。そのため、誰かが自分の結果を正しく解釈できるように、私はあなたと共有したいと思っていました。
私の小さなテストのために、私が渡しているパラメータは "デジューナー"です。念のために、のSystem.out.printlnは(「Dejeunerの」)は正しく私与える:
今すぐ次のコンソールに
déjeuner
は、元の文字列の各文字の文字/ 12月と進値であり、私はstmt.geのように、UTF-8文字列としてこの文字列を読みしようと今http://www.fileformat.info/info/unicode/char/00e9/index.htm
:UTF-8でc3a9シーケンスが望んだ-の文字であることを
next char: d 100 64
next char: ? -61 c3
next char: ? -87 a9
next char: j 106 6a
next char: e 101 65
next char: u 117 75
next char: n 110 6e
next char: e 101 65
next char: r 114 72
ノートTバイト( "UTF-8")次のように、私は突然、11のバイト配列を有する終わる:
:64 c3 83 c2 a9 6a 65 75 6e 65 72
stmt.getBytes( "ISO-8859-1")、一方は私9つのバイトを与えます
64 c3 a9 6a 65 75 6e 65 72
ここでc3a9シーケンスに注意してください!
next char: d 100 64
next char: ? -61 c3
next char: ? -87 a9
next char: j 106 6a
next char: e 101 65
next char: u 117 75
next char: n 110 6e
next char: e 101 65
next char: r 114 72
ノートc3a9シーケンス
をしばらく:今私は私が手new String(stmt.getBytes("UTF-8"), "UTF-8");
にとして、UTF-8にUTF-8シーケンスを変換しようとした場合
new String(stmt.getBytes("iso-8859-1"), "UTF-8")
結果:
next char: d 100 64
next char: ? -23 e9
next char: j 106 6a
next char: e 101 65
next char: u 117 75
next char: n 110 6e
next char: e 101 65
next char: r 114 72
utf-8(とascii)の中のe9は、私が憧れている 'é'文字です。
いずれにしても、リテラル文字列 "déjeuner"のように表示される適切な文字列にはなりません。不思議なことに、バイトシーケンスはどちらも正しいようです。
非常に有益な回答ありがとうございます。だから、javax.servlet.http.HttpServletRequestのrequest.getParameter()が、UTF-8でエンコードされたバイトシーケンスを正しく処理しないということになります。 私はreq.setCharacterEncoding( "UTF-8")を呼びました。 残っている可能性のある回避策はありますか?それは私のパラメータ(文字ではなくバイト)の元のデータを取得する方法は私にはまだ明らかではないので、私はいくつかの_non-buggy_ Stringの実装を取得して、正しいUTF文字列を取り出すことができます... – user162346
私の推測では、送信者はUTF-8でデータをエンコードしますが、正しいHTTPヘッダーを設定することはできません。 –
PHPの部分が、特にフォームのエンコーディングを正しく指定するWebページを生成することを確認してください。 –