ホームページ  >  に質問  >  本文

Java 两系统接口调用字符乱码问题?

PHP中文网PHP中文网2741日前418

全員に返信(4)返信します

  • 伊谢尔伦

    伊谢尔伦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 などのメソッドが提供される場合があります。

    返事
    0
  • PHP中文网

    PHP中文网2017-04-18 10:05:23

    URL の場合は、URLEncoder/URLDecoder クラスを使用できます

    返事
    0
  • ringa_lee

    ringa_lee2017-04-18 10:05:23

    あなたがクライアントの場合:
    サーバーから取得した文字列は UTF-8 でエンコードされています。表示する必要がある場合は、まず文字列を UTF-8 に従ってバイトコードにデコードしてから、GBK エンコードに従います。
    サーバーに送信する文字列も utf-8 でエンコードする必要があります。GBK でエンコードされた文字列をバイトコードにデコードしてから、utf-8 に従ってエンコードする必要があります。
    その逆も同様です。
    文字化けの原因は端末のエンコードの問題かも?

    リーリー

    返事
    0
  • 迷茫

    迷茫2017-04-18 10:05:23

    gbk を直接 utf-8 に変換すると、iso8859-1 でエンコードできます。つまり、2 バイトが 3 バイトに変換されます。漢字の数が奇数の場合、最後のバイトを変換するときにエラー出力が計算されますか? 、やはり文字化けしてしまいます。

    返事
    0
  • キャンセル返事