符号化と文字化---符号化基盤(ZZ)

6622 ワード

package example.encoding;

import java.io.UnsupportedEncodingException;

/** *//**
 * The Class GetBytesTest.
 */
public class GetBytesTest {

    /** *//**
     * The main method.
     * 
     * @param args the arguments
     */
    public static void main(String args[]) {
        
        String content = " ";
        String defaultEncoding = System.getProperty("file.encoding");
        String defaultLnaguage = System.getProperty("user.language");
        System.out.println("System default encoding --- " + defaultEncoding);
        System.out.println("System default language --- " + defaultLnaguage);

        GetBytesTest tester = new GetBytesTest();

        byte[] defaultBytes = tester.getBytesWithDefaultEncoding(content);
        tester.printBytes(defaultBytes);

        byte[] iso8859Bytes = tester.getBytesWithGivenEncoding(content,
                "ISO-8859-1");
        tester.printBytes(iso8859Bytes);

        byte[] gbkBytes = tester.getBytesWithGivenEncoding(content, "GBK");
        tester.printBytes(gbkBytes);

        byte[] utfBytes = tester.getBytesWithGivenEncoding(content, "UTF-8");
        tester.printBytes(utfBytes);

    }

    /** *//**
     * Gets the bytes with default encoding.
     * 
     * @param content the content
     * 
     * @return the bytes with default encoding
     */
    public byte[] getBytesWithDefaultEncoding(String content) {
        System.out.println("
Encode with default encoding
");         byte[] bytes = content.getBytes();         return bytes;     }     /** *//**     * Gets the bytes with given encoding.     *     * @param content the content     * @param encoding the encoding     *     * @return the bytes with given encoding     */     public byte[] getBytesWithGivenEncoding(String content, String encoding) {         System.out.println("
Encode with given encoding : " + encoding + "
");         try {             byte[] bytes = content.getBytes(encoding);             return bytes;         } catch (UnsupportedEncodingException e) {             e.printStackTrace();             return null;         }     }     /** *//**     * Prints the bytes.     *     * @param bytes the bytes     */     public void printBytes(byte[] bytes) {         for (int i = 0; i < bytes.length; i++) {             System.out.print(" byte[" + i + "] = " + bytes);             System.out                     .println(" hex string = " + Integer.toHexString(bytes));         }     } }
  • 【1】中国語プラットフォームの下で、テスト結果は以下の通りである:System default encoding---GBK
  • System default language --- zh
  • Encode with default encoding
  • byte[0] = -42 hex string = ffffffd6
  • byte[1] = -48 hex string = ffffffd0
  • byte[2] = -50 hex string = ffffffce
  • byte[3] = -60 hex string = ffffffc4
  • Encode with given encoding : ISO-8859-1
  • byte[0] = 63 hex string = 3f
  • byte[1] = 63 hex string = 3f
  • Encode with given encoding : GBK
  • byte[0] = -42 hex string = ffffffd6
  • byte[1] = -48 hex string = ffffffd0
  • byte[2] = -50 hex string = ffffffce
  • byte[3] = -60 hex string = ffffffc4
  • Encode with given encoding : UTF-8
  • byte[0] = -28 hex string = ffffffe4
  • byte[1] = -72 hex string = ffffffb8
  • byte[2] = -83 hex string = ffffffad
  • byte[3] = -26 hex string = ffffffe6
  • byte[4] = -106 hex string = ffffff96
  • byte[5] = -121 hex string = ffffff87
  • 【2】英語プラットフォームの下で、テスト結果は以下の通りである:System default encoding---Cp 1252
  • System default language --- en
  • Encode with default encoding
  • byte[0] = 63 hex string = 3f
  • byte[1] = 63 hex string = 3f
  • Encode with given encoding : ISO-8859-1
  • byte[0] = 63 hex string = 3f
  • byte[1] = 63 hex string = 3f
  • Encode with given encoding : GBK
  • byte[0] = -42 hex string = ffffffd6
  • byte[1] = -48 hex string = ffffffd0
  • byte[2] = -50 hex string = ffffffce
  • byte[3] = -60 hex string = ffffffc4
  • Encode with given encoding : UTF-8
  • byte[0] = -28 hex string = ffffffe4
  • byte[1] = -72 hex string = ffffffb8
  • byte[2] = -83 hex string = ffffffad
  • byte[3] = -26 hex string = ffffffe6
  • byte[4] = -106 hex string = ffffff96
  • byte[5] = -121 hex string = ffffff87
  • 【結論】
    getBytes()、getBytes(encoding)関数の役割は、システムのデフォルトまたは指定された文字セット符号化方式を使用して、文字列をバイト配列に符号化することです.
    中国語プラットフォームでは、デフォルトの文字セット符号化はGBKであり、getBytes()またはgetBytes(「GBK」)を使用する場合、GBKの符号化規則に従って各中国語文字を2つのbyteで表す.したがって、「中国語」の最終GBK符号化の結果は、-42-48-50-60であることがわかります.-42および-48は「中」を表し、「-50」および「-60」は「文」を表す.
    中国語プラットフォームの下で、指定された文字セット符号化がUTF-8である場合、UTF-8の中国語に対する符号化規則に従って、中国語ごとに3バイトで表されると、「中国語」という2つの文字は最終的に-28-72-83、-26-106-121の2つのグループに符号化される.3バイトごとに1つの中国語文字を表します.
    中国語プラットフォームでは、指定された文字セットコードがISO-8859-1の場合、この文字セットはシングルバイトコードであるため、getBytes(「ISO-8859-1」)を使用すると、文字ごとに1バイトしか取られず、漢字ごとに半分の文字しか取られません.残りの半分のバイトが失われた.この半分の文字は文字セットに対応する文字が見つからないため、デフォルトでは符号化63が用いられる.
    英語プラットフォームでは、デフォルトの文字セット符号化はCp 1252(ISO-8859-1と同様)であり、GBK、UTF-8を用いて符号化される場合、得られるバイト配列は依然として正しい(GBK 4バイト、UTF-8は6バイト).JVM内部にはUnicodeで文字列が格納されているため、getBytes(encoding)を使用すると、JVMにUnicodeから指定された符号化への変換が1回行われます.GBKの場合、JVMは4バイトに変換され、UTF-8の場合、JVMは6バイトに変換されます.しかしISO-8859-1では変換できないため(2バイト--->1バイト、半分のバイトを切り取った)、変換後の結果は誤りである.
    同じプラットフォームの下で、同じ中国語文字、異なる符号化方式の下で、完全に異なるバイト配列が得られる.これらのバイト配列は正しい可能性があります(文字セットが中国語をサポートしている限り)、完全に間違っている可能性があります(文字セットは中国語をサポートしていません).
    覚えておいてください.
    StringクラスのgetBytes(encoding)メソッドを簡単に使用したり乱用したりしないで、getBytes()メソッドをできるだけ避ける必要があります.この方法はプラットフォーム依存性であるため,プラットフォームが予知できない場合には全く異なる結果が得られる可能性がある.バイト符号化が必要であれば,ユーザがencodingを確保する方法は,当初文字列入力時のencodingである.