JAvaのIOストリームの文字符号化


1.文字コードの発展過程
段阶1:コンピュータは数字だけを认识して、私达はコンピュータの中ですべてのデータはすべて数字で表して、英语の記号が限られているため、使うバイトの最高位は0です.各バイトは0~127の数字で表す、例えばAは65、aは97である.これがアメリカの標準情報交換コード-ASCIIです.段階2:コンピュータが世界に普及するにつれて、多くの国と地域が自分の文字をコンピュータ、例えば漢字に導入した.このとき、1バイトが数字の範囲が小さすぎて、すべての中国語の漢字を含むことができないことを示すことが判明すると、1バイトを2バイトで表すことになる.規定:従来のASCII文字の符号化は変わらず、依然として1バイトで表す、1つの中国語文字と2つのASCII符号文字を区別するために、中国語文字の各バイトの最上位は1(中国語のバイナリは負数)と規定する.この規範はGB 2312の符号化であり、その後GB 2312の基礎の上でより多くの中国語の文字を増加し、例えば漢字、つまりGBKが現れた.段階3:新しい問題は、中国では漢字を認識しているが、漢字を他の国に伝えれば、その国のコード表に漢字が収録されていないので、実は別の記号や文字化けが表示される.各国がローカライズ文字符号化による影響を解決するために、世界中のすべての記号を統一して符号化-Unicode符号化を行う.このとき、ある文字は世界中のどこでも固定されている.例えば「兄」は、どこでも16進数の54 E 5で表されている.Unicodeの符号化文字はいずれも2バイトの大きさを占めている.一般的な文字セット:ASCII:1バイトを占め、128シンボルしか含まれません.文字を表すことができないISO-8859-1:(latin-1):1バイトを占めて、西欧の言語を収録して、.漢字を表すことができません.ANSI:2バイトを占め、簡体字中国語のオペレーティングシステムではANSIはGB 2312を指す.GB 2312/GBK/GB 18030:2バイトを占め、中国語をサポートする.UTF-8:Unicodeに対する可変長文字符号化であり、万国符号とも呼ばれ、Unicodeの実現方式の一つである.符号化の最初のバイトは依然としてASCIIと互換性があり、これにより、ASCII文字を処理していたソフトウェアは、一部の修正を必要とせず、または一部の変更を行うだけで使用を継続することができます.そのため、電子メール、ウェブページ、その他の文字を格納または転送するアプリケーションで優先的に採用される符号化となっている.インターネットエンジニアリングワークグループ(IETF)は、すべてのインターネットプロトコルがUTF-8符号化をサポートしなければならないことを要求している.UTF-8 BOM:MSが作ったコードで、デフォルトでは3バイトを占めていますので、これは使用しないでください.格納文字、数字、漢字:格納文字と数字は、どの文字セットでも1バイトを占める.漢字記憶:GBKファミリーが2バイト、UTF-8ファミリーが3バイト.
中国語を1バイトの文字セット(ASCII/ISO-8559-1)で記憶することはできない.
2.文字の符号化と復号化動作
符号化:文字列をbyte配列に変換する.復号:byte配列を文字列に変換する.符号化と復号化の文字が同じであることを保証しなければならない.そうしないと、符号化が乱れてしまう.
import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class IODemo3 {
	public static void main(String[] args) throws UnsupportedEncodingException {
		String str = "  ";
		//  String---->byte[]
		byte[] bytes = str.getBytes();//      UTF-8
		System.out.println(Arrays.toString(bytes));//[-26, -99, -88, -27, -109, -91]
		
		//  byte[]--->String
		String ret = new String(bytes);////      UTF-8
		System.out.println(ret);//  
		System.out.println("================================");
		
		String str2 = "   ";
		//  String---->byte[]
		byte[] bytes2 = str.getBytes("GBK");//          
		System.out.println(Arrays.toString(bytes2));//[-47, -18, -72, -25]
				
		//  byte[]--->String
		String ret2 = new String(bytes2);//      UTF-8,
		System.out.println(ret2);//      ���,           GBK
		//        GBK
		String ret3 =new String(bytes2, "GBK");
		System.out.println(ret3);//  
	}
}