Java文字符号化の原理


Java文字符号化の原理
  
 Java開発では、文字化けしの問題に遭遇することが多く、このような問題に遭遇すると、いつもでたらめを言って、誰もが自分のコードに問題があることを認めたくない.実は符号化問題はそんなに神秘的ではなく、Javaの符号化の本質を明らかにする過程が明らかになった.
まず図を見てください.
 
実際,符号化の問題には,JVM内とJVM外の2つの側面がある.
1、Javaファイルのコンパイル後にclassを形成する
ここでJavaファイルの符号化は多様である可能性があるが、Javaコンパイラはこれらの符号化をJavaファイルの符号化フォーマットに従って正しく読み取ってclassファイルを生成する.ここでclassファイル符号化はUnicode符号化(具体的にはUTF-16符号化)である.
したがって、Javaコードで文字列を定義します.
String s=「漢字」
コンパイル前にjavaファイルがどのような符号化を使用しても、コンパイル後にclassになった後、彼らは同じ---Unicode符号化表現です.
2、JVMでのエンコーディング
JVMがclassファイルをロードして読み込むときにUnicode符号化方式でclassファイルを正しく読み取ると、元定義のString s=「漢字」になります.メモリにおける表現形式はUnicode符号化である.
String.getBytes()を呼び出すと、実は文字化けのために禍根を買った.この方法は、プラットフォームのデフォルトの文字セットを使用して文字列に対応するバイト配列を取得するためです.WindowsXP中国語版では、デフォルトの符号化はGBKであり、実行を信じない:

    
    
    
    
  1. public class Test {   
  2. public static void main(String[] args) {   
  3. System.out.println(" JRE:" + System.getProperty("java.version"));   
  4. System.out.println(" JVM :" + Charset.defaultCharset());   
  5. }   

現在のJRE:1.6.0_16
現在のJVMのデフォルト文字セット:GBK
異なるシステム、データベースが複数回符号化された後、その原理が理解されなければ、乱符号化を招きやすい.したがって,一つのシステムでは,文字列の符号化を統一する必要があり,この統一曖昧点は対外統一である.例えば、方法文字列パラメータ、IOストリーム、中国語システムでは、GBK、GB 13080、UTF-8、UTF-16などを統一的に使用することができますが、使用可能な文字が正常に表示され、文字化けしの問題を回避するために、より大きな文字セットを選択する必要があります.(すべてのファイルに対してASCIIコードを使用すると仮定)では双方向変換は実現できません.
特に注意しなければならないのは、UTF-8はすべての中国語の文字セットの符号化を収容することができないので、特殊な場合、UTF-8回転GB 18030は文字化けになる可能性がありますが、馬鹿なBたちはよく中国語システムをしてUTF-8で符号化するのが好きで、言えないので出てきます!最も愚かなBは、1つのシステムが複数人で作って、ソースファイルのある人はGBKでコードして、ある人はUTF-8を使って、ある人はGB 18030を使っています.FK、すべて中国人で、アウトソーシングプロジェクトではありませんて、どんなUTF-8を使って、神経!ソースコードはすべてGBK 18030でOKで、ANTスクリプトのコンパイル時に認識できない文字コードを提示しないようにします.
したがって、中国語システムでは、文字化けしを最小限に抑えるために、GBKまたはGB 18030符号化(実際にはGBKはGB 18030のサブセット)を選択することが望ましい.
3、メモリ中の文字列の符号化
メモリ内の文字列はclassコードから直接ロードされた文字列に限らず、テキストファイルから読み込まれた文字列や、データベースから読み込まれた文字列、バイト配列から構築された文字列もありますが、基本的にはUnicode符号化ではありません.理由は簡単で、ストレージの最適化が行われています.
そのため、様々な符号化問題を処理する必要があり、処理前に「ソース」の符号化を明確にし、指定された符号化方式でメモリに正しく読み出す必要がある.1つの方法のパラメータであれば、このパラメータは別の日本語システムから伝達される可能性があるため、実際には文字列パラメータの符号化を明確にしなければならない.文字列符号化が明確になった場合、文字列を要求通りに正しく処理し、文字列の文字化を避けることができる.
文字列を復号符号化する場合は、次の方法を呼び出す必要があります.

    
    
    
    
  1. getBytes(String charsetName)   
  2. String(byte[] bytes, String charsetName) 

文字セット名を持たない方法で署名するのではなく、上記の2つの方法でメモリ内の文字を再符号化できます.