伊谢尔伦2017-04-18 10:05:23
失敗した理由を知るには、 new String(str.getBytes("GBK"),"UTF-8"); の意味を理解する必要があります。
まず、Java の String は内部的に UTF-16LE でエンコードされます。
str.getBytes("GBK")、Byte配列を取得し、strのエンコーディングをGBKに変換する内容です。
new String(str.getBytes("GBK"),"UTF-8") は、この Byte 配列の内容を UTF-8 でエンコードされたデータとして扱い、それを String (UTF-16LE) に変換します。
分かりましたか?これが機能する場合、幽霊が存在することになります。
クライアントとサーバーは両方とも Java であるため、Java の文字列エンコーディングは UTF-16 である必要があります。システム エンコーディング (Windows または Linux) の影響を受けません。
この場合、文字列は直接送信しないことをお勧めします。文字列は、使用するライブラリ (tomcat を例として、デフォルトの iso8859-1) によって自動的にエンコーディングに変換されるからです。
バイト配列を直接送受信できる場合 は、間違いなくプロトコル仕様の UTF-8 を使用できます。どちらかの当事者が受信するデータは new String(data, "UTF-8") で、送信されるデータは str.getBytes("UTF-8") です。
クライアント コードを変更できない場合、またはクライアント コードが C または他の言語で記述されている場合。 クライアントが GBK データを送信していることが確実な場合。 サーバーがバイト配列 を直接受信できる場合、新しい String(data, "GBK") を解析できます。返される場合も、バイト配列 str.getBytes("GBK") になります。
String のみを送受信できる場合は、それを構成し、変換するエンコーディングを設定する必要があります。例えばtomcatの場合、GETデータの場合はweb.xmlを修正し、URLエンコードの設定項目を追加する必要があります。 POST データ の場合、 を変換するフィルターを作成する必要があります。 HTTP 通信クラスの場合、SetEncoding などのメソッドが提供される場合があります。
ringa_lee2017-04-18 10:05:23
あなたがクライアントの場合:
サーバーから取得した文字列は UTF-8 でエンコードされています。表示する必要がある場合は、まず文字列を UTF-8 に従ってバイトコードにデコードしてから、GBK エンコードに従います。
サーバーに送信する文字列も utf-8 でエンコードする必要があります。GBK でエンコードされた文字列をバイトコードにデコードしてから、utf-8 に従ってエンコードする必要があります。
その逆も同様です。
文字化けの原因は端末のエンコードの問題かも?
迷茫2017-04-18 10:05:23
gbk を直接 utf-8 に変換すると、iso8859-1 でエンコードできます。つまり、2 バイトが 3 バイトに変換されます。漢字の数が奇数の場合、最後のバイトを変換するときにエラー出力が計算されますか? 、やはり文字化けしてしまいます。