最近のプロジェクトは、時々文字化け中国の問題が発生し、主にこのプログラムを使用する理由について話したソリューションについての話、そしてないことが判明、オンライン多くの情報を確認し、この方式の原理は何ですか?
最も典型的には、接続URLのデータベースでは、我々は一般的にdb.propertiesクラスパスの下に置く、と私たちのJavaコードセットUTF-8にもかかわらず、JSPはまた、データベースのUTF-8を設定し、UTF-8を設定します、データベースにデータを挿入、それでも中国の文字化けがあるだろう、最終的な解決策は、データベースへのURL接続で接続UTF-8で使用される当社の符号化フォーマットを追加することですが、それはなぜだろうか?
のは、中国の文字化けを解決する方法を、なぜ、どのようにエンコードするためにどのようなコード、およびデコード、なぜ中国の文字化けコーディング、Javaのコーディング下の問題についてお話しましょう。
1.なぜコーディング
コンピュータに戻って行かなければならない。この問題は、我々は、ヒトでの使用言語、私たち人間は、これらの記号を理解することができる方法を表す記号です。だから、多くの人間の言語、したがって、これらの言語の多くのシンボルを表し、あなたは基本的なストレージユニットにコンピュータを使用することはできません---表現するバイト、したがって、私たちの言語を理解するために、コンピュータのために、分割または一部の翻訳作業を経なければなりません。私たちは、英語に翻訳するために、コンピュータに変換する必要があり、他の言語を使用できるようにするには、言語を理解することができ、コンピュータが英語であると仮定することができます。翻訳プロセスは、符号化されています。
情報の最小単位は、コンピュータバイトに格納されている、すなわち、8「ビット、それは文字の範囲で表すことができ、0〜255であり、あまりにも人間のシンボルが表現する:全体的に、理由符号化は次のように要約することができます。それは完全にシングルバイトで表現することはできません。
この競合を解決するには、文字からバイトへの新しいデータ構造のcharは、エンコードする必要があります持っている必要があります。
2.一般的なコーディング
様々な言語でコミュニケーションする必要性を理解し、それを変換する方法を、次に、必要である翻訳?翻訳コンピュータは、その上の共通右-ASCII、ISO-8859-1、GB2312、GBK、UTF-8、UTF-16とのさまざまな方法を提供します。彼らはこのルールコンピュータが正しくご文字を識別することができますに従って規則を定め変換し、辞書として見ることができます。このようGB2312、GBK、UTF-8、UTF-16などの多くの現在のエンコード形式は、その後、最終的に我々は文字にそれを保存するためにどのエンコーディング形式を選択し、文字を識別することができますか?重要なストレージスペースが重要な符号化効率であるが、あまりにも他の要因を考慮する必要があります。
3.どのように符号化、復号化
文字列、例えば、次のコード
S =文字列" これは中国の文字列である" ; バイト [] B = s.getBytes(" UTF-8。" ); 文字列のn = 新しい新しい文字列(B、" UTF-8。");
符号化は使用:ユーザーがコンピュータ言語に私達の言語は、一般にコンピュータのではなく、ユーザの操作に関連する送信又は記憶に使用、理解することができる知ることができます。
デコード:知っている我々のユーザーの言語のためのバイトコードインタプリタ。
4.なぜ中国の文字化けを持っています
最初のケース:中国の文字セットを使用すると、これは比較的まれで、エンコードされた認識されません
後者の場合、文字セット符号化を使用するが、より一般的である復号化する別の文字セット、例えば、JavaコードをUTF-8でエンコードされているが、データベースにアクセスする時間、GBKを復号するために使用されるデータベースとこれは中国の文字化けになります。
文字セットの使用
文字セットのcharset = Charset.forName(" UTF-8 " )。 ByteBufferのByteBuffer = charset.encode(文字列); CharBufferのCharBufferの = charset.decode(のByteBuffer)。
どのコーデックで5.java
文字列名= 「私は小明しています」。 toHex(name.toCharArray())。 <スパンのスタイル= " フォントサイズ:18px;空白:事前; " > </ span>を<前の名前= " コード" クラス = " javaの" > してみてください{ バイトが [] ISO8859 = name.getBytes(" ISO- 8859-1 " ); toHex(ISO8859)。 バイト [] GB2312 = name.getBytes(" 2312 " )。 toHex(GB2312)。 バイト [] GBK = name.getBytes(" toHex(GBK)。 }
文字列str = " 小米" 。 バイト [] B = str.getBytes(" UTF-8 ")。
公共の バイト[] GetBytesメソッド(文字列たcharsetName)は にUnsupportedEncodingException {スロー 場合(たcharsetName == NULL)スロー 新しい)(NullPointerExceptionが。 戻り StringCoding.encode(たcharsetName、値、0 、value.length)を、 }
静的 バイト [](文字列たcharsetNameをコードチャー [] CAを、int型オフ、INT LEN) にUnsupportedEncodingExceptionスロー { StringEncoder SE = DEREF(エンコーダ)。 文字列のCSN =(たcharsetName == nullの)?" ISO-8859-1 " :たcharsetName。 もし((SE == NULL)||!(csn.equals(se.requestedCharsetName()) || csn.equals(se.charsetName()))){ SE = NULL ; 試します{ 文字セットCS = lookupCharset(CSN)。// 生成字符集实例 場合(CS =!ヌル) SE = 新しいStringEncoder(CS、CSN); } キャッチ(IllegalCharsetNameException x)から{} であれば(SE == NULL ) スロー 新しいにUnsupportedEncodingException(CSN)を、 セット(エンコーダ、SE)。 } 戻りse.encode(LEN、オフCA)。 }
プライベート 静的な文字セットlookupCharset(文字列のCSN){ 場合(Charset.isSupported(CSN)){ しようと{ 返すCharset.forName(CSN)を、 } キャッチ(UnsupportedCharsetException x)から{ スロー 新しいエラー(X)を、 } } 戻り ヌル。 }
プライベートStringEncoder(文字セットCS、文字列RCN){ この .requestedCharsetName = RCN。 これは = .CS CSを。 この .CE = cs.newEncoder() .onMalformedInput(CodingErrorAction.REPLACE) .onUnmappableCharacter(CodingErrorAction.REPLACE)。 この .isTrusted =(。cs.getClass()getClassLoader0()== NULL ); }
オリジナル:https://blog.csdn.net/u010627840/article/details/50407575