文字セット?

2030 ワード

今日FlexのXMLSocketで通信する时、中国语はいつも文字化けして、わけがわからなくて、最后についにデバッグしました.一晩中忙しかったのでまとめてみましょう...
もちろん、ほとんどは実践の中でまとめられた情報で、まだ理論の検証を通じていないので、間違いを指摘することを歓迎します.
一晩中忙しかったということは、実は、今考えてみると、解決策とはStringの2つの方法にほかならない.

String(byte[] bytes, String charsetName) //        (charsetName), byte     String

 byte[] getBytes(Charset charset) //      charset    String     byte   ,          byte   。 

問題点について説明しましょう.FlexのクライアントファイルはUTF-8で符号化され、サーバjava側はgbkで符号化されています.したがって、Flex側から送信されるデータはutf-8のフォーマットを使用します.一方,サーバがデータを受信する場合,処理を行わなければ,gbkのフォーマットを用いて受信したクライアントから送信されたutf-8フォーマットの符号化を解析する.そのため、サーバーの中国語に文字化けしが発生しました.
処理すると、得られたデータをutf-8形式の符号化に変換すれば、中国語になります.方法は簡単だ

xmlMsg = new String(xmlMsg.getBytes(),"utf-8");

//   ,         
xmlMsg = new String(xmlMsg.getBytes("GBK"),"utf-8");


内訳:xmlMsg.getBytes()のxmlMsgは、読み込んだ元のデータをbyte配列に復元するフォーマットであり、これらのデータに基づいてutf-8フォーマットのStringを再作成します.
サーバ側での符号化フォーマットはGBKであるため、StringのgetBytesの方法はデフォルトでGBK符号化によって解析される.
ここで注意しましょう.読み込んだ元のデータはutf-8の配列ですが、デフォルトではgbkを使用して符号化され、ロックが加わったような文字化けが発生します.このロックを解くには、まずデータを復元すること、すなわちgbkで復元し直し、その後、得られたbyte配列をutf-8に基づいて処理し、実際に表示されている中国語を得ることです.直接gbkの符号化を行うわけではありませんよ.
サーバがクライアントに情報を送信するのは簡単です.呼び出すだけです.
getBytes("utf-8")

はい、システム独自のgbk符号化モードではなくutf-8の形式を使用していることを示します.その後、クライアントは対応するutf-8形式の中国語をデフォルトで取得し、表示に文字化けしていません.
しかし、やはり少し気絶しました.このStringのコードはいったいどんな形式ですか.
ファイルシステムでは、データは0と1にほかならないが、データを読み取るとき、異なる文字セットはこれらの01の組み合わせを説明する方法にすぎないが、これらのデータはメモリに解析された後に置かれるのだろうか.いくつかの資料を探しましたが、大体次のようです.
ClassファイルのStringはすべてunicode符号化を使用し、具体的にはutf-16符号化である.
Stringまたはcharはメモリ形式であり、byte[]はネットワーク転送またはストレージのシーケンス化形式である.この両者は同じレベルの概念ではない.Stringは仮想マシンに保存されている定数プールで、1つのString文字列はユニークで、セミコロンがなく、異なる文字セットの定数プールが存在しません.したがって,異なる文字セットは,シーケンス化が必要な場合に定数プール内の同じ文字セットの異なる解析方式に現れるべきである.どの言語にも「こんにちは」という概念があるようだが、発音はそれぞれ異なる.
はい、これは私の今の観点で、まだ不確定なところがあります.ご指導を歓迎します.