84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
认证高级PHP讲师
失敗した理由を知るには、 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 などのメソッドが提供される場合があります。
URL の場合は、URLEncoder/URLDecoder クラスを使用できます
あなたがクライアントの場合: サーバーから取得した文字列は UTF-8 でエンコードされています。表示する必要がある場合は、まず文字列を UTF-8 に従ってバイトコードにデコードしてから、GBK エンコードに従います。 サーバーに送信する文字列も utf-8 でエンコードする必要があります。GBK でエンコードされた文字列をバイトコードにデコードしてから、utf-8 に従ってエンコードする必要があります。 その逆も同様です。 文字化けの原因は端末のエンコードの問題かも?
gbk を直接 utf-8 に変換すると、iso8859-1 でエンコードできます。つまり、2 バイトが 3 バイトに変換されます。漢字の数が奇数の場合、最後のバイトを変換するときにエラー出力が計算されますか? 、やはり文字化けしてしまいます。
失敗した理由を知るには、 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 などのメソッドが提供される場合があります。
URL の場合は、URLEncoder/URLDecoder クラスを使用できます
あなたがクライアントの場合:
リーリーサーバーから取得した文字列は UTF-8 でエンコードされています。表示する必要がある場合は、まず文字列を UTF-8 に従ってバイトコードにデコードしてから、GBK エンコードに従います。
サーバーに送信する文字列も utf-8 でエンコードする必要があります。GBK でエンコードされた文字列をバイトコードにデコードしてから、utf-8 に従ってエンコードする必要があります。
その逆も同様です。
文字化けの原因は端末のエンコードの問題かも?
gbk を直接 utf-8 に変換すると、iso8859-1 でエンコードできます。つまり、2 バイトが 3 バイトに変換されます。漢字の数が奇数の場合、最後のバイトを変換するときにエラー出力が計算されますか? 、やはり文字化けしてしまいます。