Javaにおける文字列の符号化変換

4170 ワード

説明: JVM内部では、文字列はjavaでunicodeで統一されています.ソースファイルがどのように符号化されているかにかかわらず、まず対応する符号化方式で文字列に解析し、文字列をunicode形式のバイト配列に変換して内部記憶します.したがって,ソースファイルがどんなフォーマットであっても,同じ文字列で最後に得られたunicodeバイト配列は完全に一致する.
プログラムが実行されていない場合、文字列は元の符号化バイト配列でシステムディスクに格納される.プログラムが実行されると、文字列はunicode文字配列に変換されてJVMメモリに格納されます(元のバイト配列-->元の符号化方式復号-->文字列-->Unicode符号化-->Unicodeバイト配列)
その他:      1、ASIIコード:文字列の各文字は1バイトで表される.各文字は実際には00 h-7 Fhから7ビットしか使用されていません.128文字しか表現できません.漢字を表すことはできません.      2、Unicodeコード:文字列の各文字は2バイトで表されます.
エンコーディング:文字列----->バイト配列復号:バイト配列----->文字列
文字列GBK回転UTF-8プロセス:
1、   -->  GBK  -->GBK             (     UTF8  GBK    ,    )
        
2、GBK    -->  GBK  -->     -->  unicode  -->unicode       ( GBK       Unicode    )
        
3、unicode    -->  unicode  -->     -->  UTF8  -->UTF8       (  unicode       UTF8    )
        
4、UTF8    -->  UTF8  -->       (  UTF8    )

テスト:
public class TestExcode {

public static void main(String[] args) throws IOException {
    testStrEncode1();
    //testStrEncode2();
    //testStrEncode3();
}

public static void testStrEncode1() throws UnsupportedEncodingException {
    
    String a = "  ";
    //      ,     UTF-8,     UTF-8        ,          UTF-8       。
    
    //     ,a    unicode       JVM   
    //  ISO-8859-1   ,   unicode           ,  ISO-8859-1           
    byte[] b = a.getBytes("ISO-8859-1");   //ISO-8859-1      ,                 
    byte[] c = a.getBytes("UTF-8");        //       UTF-8,                 
    
    //  UTF-8    ISO-8859-1       
    //                (  )
    String result = new String(b,"UTF-8");
    String result1 = new String(c,"UTF-8");
    
    System.out.println(result);     //  '??' ,  ISO-8859-1       
    System.out.println(result1);    //  '  '
}

public static void testStrEncode2() throws UnsupportedEncodingException {
    
    String a = "你好";
    //     UTF-8,     UTF-8        ,        UTF-8       。
    
    //     ,a    unicode       JVM   
    //  ISO-8859-1   ,   unicode           ,  ISO-8859-1             
    byte[] b = a.getBytes("ISO-8859-1"); //ISO-8859-1      "你好",                   
    byte[] c = a.getBytes("UTF-8");      //UTF-8    "你好",                 
    
    //  UTF-8    ISO-8859-1       
    //                
    String result = new String(b,"UTF-8");  
    String result1 = new String(c,"ISO-8859-1");
    
    System.out.println(result);   //  '  '
    System.out.println(result1);  //  '你好'

    //  :  testStrEncode1 testStrEncode2
    // "  "   "你好" ,result  '  ',result1  "你好",
    //   "你好" ISO-8859-1         "  " UTF-8          
}
public static void testStrEncode3() throws UnsupportedEncodingException {
    //GBK、ISO-8859-1、UTF-8、Unicode              
    //GBK UTF-8        ,  UTF-8      ,          ,     

    String fileName = "       ";

    //GBK  ,GBK  。    。
    System.out.println(new String(fileName.getBytes("GBK"),"GBK"));

    //GBK  ,ISO-8859-1  。  
    System.out.println(new String(fileName.getBytes("GBK"),"ISO-8859-1"));

    //GBK  ,    UTF-8  。  
    System.out.println(new String(fileName.getBytes("GBK")));

    //ISO-8859-1  ,ISO-8859-1  。ISO-8859-1      ,    ,   。
    System.out.println(new String(fileName.getBytes("ISO-8859-1"),"ISO-8859-1"));
    
    //ISO-8859-1  ,    UTF-8  。  
    System.out.println(new String(fileName.getBytes("ISO-8859-1")));

    //ISO-8859-1  ,GBK  。  
    System.out.println(new String(fileName.getBytes("ISO-8859-1"),"GBK"));

    //UTF-8  ,    UTF-8  。    
    System.out.println(new String(fileName.getBytes("UTF-8")));
    
    //UTF-8  ,ISO-8859-1  。  
    System.out.println(new String(fileName.getBytes("UTF-8"),"ISO-8859-1"));

    //UTF-8  ,GBK  。  
    System.out.println(new String(fileName.getBytes("UTF-8"),"GBK"));

}
}