バイトのストリームに面している場合、その実際の意味は、エンコードを指定せずには知ることはできません。
この文はまた、「バイトからバイト、バイトからキャラクターまで」という問題に直面しているときに、私たちが心の中で常に覚えているものであるべきです。それ以外の場合、文字化けの問題が続く場合があります。
実際、文字化けの問題の本質は、エンコードとデコードが同じエンコードを使用しないことです。この原則を理解していれば、文字化けの問題を簡単に解決するのは簡単です。
Javaで一般的に使用されるのは次のとおりです。
1。文字列クラスは、byte []のコンストラクター文字列(byte []バイト)を使用します。文字列クラスは、2つのオーバーロードを同時に提供します(1)string(byte [] bytes、charset charset)
(2)string(byte [] bytes、string charsetname)を使用してエンコードを指定します。
2. getBytes関数byte [] stringクラスのgetBytes()には、次の2つの過負荷もあります。
(1)byte [] getBytes(charset charset)
(2)byte [] getBytes(string charsetname)
指定されたエンコードを必要としないものはすべて、System.getProperty( "file.Encoding")、charset.defaultcharset()を使用して取得できるプラットフォームのデフォルトcharsetを使用して取得されます。
3。PrintStreamの印刷(String S)もこの問題に合わせて設計されています。このため、PrintStreamのコンストラクターはPrintStream(ファイルファイル)とPrintStream(ファイルファイル、文字列CSN)だけではありません。
それ以外の場合、文字列の文字は、プラットフォームのデフォルト文字エンコードに従ってバイトに変換されます。
dataoutputStream構造にはエンコードを指定する方法はありませんが、WriteUtf(String str)を提供します
最初に例を挙げて、エンコードを指定する必要性を示します。
WebページがEncodingをUTF-8、<Meta http-equiv = "content-type" content = "text /html; charset = utf-8" />に指定する場合、ページにフォームがあり、サーブレットに送信されます
次に、ユーザーが入力した文字によって渡されるバイトストリームは、指定されたエンコードに従ってエンコードされています。たとえば、「Hello Hello」を入力する場合、UTF-8の場合、送信されたものは次のとおりです。
[104、101、108、108、111、-28、-67、-96、-27、-91、-67]
、次の漢字のそれぞれが3バイトを使用していることがわかります。これは、UTF-8の関連知識を参照するために使用できます。
ただし、ページがGBKを指定した場合、送信は異なります。
[104、101、108、108、111、-60、-29、-70、-61]
したがって、request.getParameterをサーブレット側に使用する場合、内部的に呼び出される必要があります
string s = new String(bytes、response.getEncoding())。応答がエンコーディングを設定しない場合、デフォルトのエンコードNULLはJavaプラットフォームのGBKに変換され、その後、中国人は文字化けします。
したがって、文字化けのコードを回避するために、JSPサイトは一般にフィルターを設定し、すべてのページとサーブセットが統合されたエンコードを持つように設定されています。 Response.SetEncoding、request.SetEncoding。
内部Java文字列はchar []です。これは、UTF-16が保存された16ビットでエンコードされたユニットです。この目的のために、文字と文字列をバイトに変換してファイルやネットワークに出力したり、ファイルやネットワークから読み取られたバイトストリームを実際に重要な文字に戻す場合、エンコードが何であるかを理解する必要があります。
いくつかの経験
1.文字列クラスは常にUnicodeエンコードに保存されます。
2。string.getBytes()の使用に注意してください。
文字セットパラメーターが含まれていない場合、JVMの文字セットエンコードに依存します。通常、Linux上のUnicode、WindowsのGBKです。 (JVMのデフォルトの文字セットエンコードを変更する場合は、JVMを起動するときにOption -Dfile.Encodeing = utf -8を使用します。
安全上の理由から、たとえば次のように、常にパラメーターで呼び出すことをお勧めします。 S.GetBytes( "UTF-8")。
3.チャーセットクラスは非常に便利です。
(1)charset.encodeはエンコード、つまり、バイト配列を指定して出力する文字セットエンコード形式の文字列をエンコードしています。
(2)charset.decodeはデコードされています。つまり、指定して文字列に出力する文字セットエンコード形式のバイト配列をデコードします。
例として:
string s = charset.defaultCharset()。displayName();文字列S1 = "私はあなたが好きです、私の愛"; bytebuffer bb1 = bytebuffer.wrap(s1.getbytes( "utf-8")); for(byte bt:bb1.array()){system.out.printf( "%x"、bt); } // char [] usage char [] charray = {'i'、 'l'、 'o'、 'v'、 'e'、 'you'}; // Charbufferの使用Charbuffer CB = Charbuffer.Wrap(Charray); // pointer cb.flip();文字列S2 = new String(Charray); // bytebuffer usage bytebuffer bb2 = charset.forname( "utf-8")。encode(cb); // charsetを使用して指定された文字としてエンコードSET bytebuffer bb3 = charset.forname( "utf-8")。エンコード(s1); byte [] b = bb3.array(); // charsetを使用して、指定された文字セットbytebuffer bb4 = bytebuffer.wrap(b)に従って文字列としてデコードします。 string s2 = charset.forname( "utf-8")。decode(bb4).tostring();