[AVA]19日目(文字列に関連するクラス/キャラクタセット(CharacterSet)


8月10日(月)


⑪キャラクタセット


Unicode


国際的に通用する2バイト国際文字体系
(UCS:Universal Code System).
アップルコンピュータ、IBM、マイクロソフトなど
Unicodeは1990年に最初のバージョンを発表した.
ISO/IEC JTC 1は1995年9月に国際規格として制定された.
正式名称はISO/IEC 10646-1(汎用多部門符号化文字セット).
データ交換を容易にするために、1文字に付与された値
16位に統一する.
コードの各文字の英語は7ビット、非英語は8ビットです.
ハングルまたは日本語の値は16位です.
これらはすべて16位に統一された.

UTF-8とUTF-16


UTF-8とUTF-16の違いを一言で要約します.
つまり、文字を表す単位が違うということです.
UTF-8は、8ビットの可変マルチバイト文字を表す.
UTF-16は、16ビットの可変長マルチバイトで文字を表す.

- ★ UTF-8(8bit UCS Transformation Format)


Webのデフォルトで使用されるコード.
UCS-2で定義された文字セットの使用
記述された文字列は、バイト列の各文字として返されます.
1~6バイトを変換可能なマルチバイトに変換します.

- ★ UTF-16(16bit UCS Transformation Format)


Javaの基本コード.
Javaでは、文字が1つ格納されている場合、文字もハングルも2バイトになります.
UCS-2で定義された文字セットの使用
説明された文字列にUCS−4の文字の一部を埋め込むための符号化方式.
UTF-8と併用できます.
利用可能なUCS-2の文字数を大幅に増やすことができます.
※ジャワダンはUTF-16、ネットはUTF-8
変換が必要な場合があります.

文字コードのタイプ


▪ KSC5601


ハングル完了型標準(ハングル2350文字).
韓国工業標準情報処理分野(C)の5601号標準案.

▪ KSC5636


英語の文字の標準.
韓国工業標準情報処理分野(C)の5636号標準案.
既存のASCIIコードのスラッシュを円で置き換えます.

▪ ★ EUC-KR(MS949)


Bell-Laboratories Unixで
推奨される拡張Unicode(Extend UNIX Code)
英語はKSC 5636、韓国語はKSC 5601で処理する.
すなわち、EUC−KR(MS 949)=KSC 5636+KSC 5601である.

▪ UTF-8


英語と数字は1バイト、韓国語は3バイトで表す.
(Web上で使用することが多い.UTF-8形式でJSPを書く場合)
ファイルもUTF-8形式で保存する必要があります.)

▪ UTF-16


Java基本文字コード.
英語と数字は1バイト、韓国語は2バイトで表す.

▪ ISO-8859-1


US-ACSCIIでは西欧言語タグに必要なものはありません
94文字の順に並べます.

キャラクタセット(CharacterSet)コードの説明📝

import java.io.UnsupportedEncodingException;
public class Test137
{
	public static void main(String[] args) //throws UnsupportedEncodingException   //check~!!!!
	{
		byte[] buf;
		String name = new String("김연경");

		System.out.println("디폴트 캐릭터셋 : " + System.getProperty("file.encoding"));
		//--==>> 디폴트 캐릭터셋 : MS949

		//『String.getBytes()』   // String 클래스가 가지고 있음
		//  : 디폴트 캐릭터셋으로 바이트 배열을 반환하는 메소드
		buf = name.getBytes();   // 운영체제의 기본 인코딩 방식에 따라서 데이터를 쪼개는 것
			
		System.out.println("Length : " + buf.length); 
		//--==>> Length : 6

		for(byte b: buf)
			System.out.print("[" + b + "] ");
		System.out.println();
		//--==>> [-79] [-24] [-65] [-84] [-80] [-26]
		//       ----------- ----------- -----------
		//            김          연         경

		try
		{
			// 『UTF-8』로 바이트 배열을 반환하는 메소드
			buf = name.getBytes("utf-8");   // 넘겨진 매개변수 인코딩 방식에 따라 데이터를 쪼개는 것   //check~!!이구문때문에 위에 예외처리
			
			System.out.println("Length : " + buf.length);
			//--==>> Length : 9   //다른 방식으로 쪼갠것이 확인 됨

			for (byte b : buf)
				System.out.print("[" + b + "] ");
			System.out.println();

			//--==>> [-22] [-71] [-128] [-20] [-105] [-80] [-22] [-78] [-67]
			//       ------------------  ----------------   ---------------
			//                김                연               경

			// new String("이지영");
			// new String(바이트배열, 인코딩방식);
			// new String(buf, "utf-8");
			
			// utf-8 형태로 저장된 바이트 배열을
			// String 객체로 파라미터 값 utf-8을 부여하여 생성
			// -> utf-8 기반으로 buf 바이트 배열을 합쳐
			//		문자열 객체 생성 후 이름 출력
			System.out.println("Value 1 : " + new String(buf, "utf-8"));
			//--==>> Value 1 : 김연경

			System.out.println();  // 개행
			
			// utf-8 형태로 저장된 바이트 배열을
			// String 객체로 파라미터 값 없이 생성
			// -> 디폴트 캐릭터셋을(ms949) 기반으로 buf 바이트 배열을 합쳐
			//		문자열 객체 생성 후 이름 출력
			System.out.println("Value 1 : " + new String(buf));   //이럴 때 문자가 깨져 나온다!!
			//--==>> Value 1 : 源??뿰寃?

			System.out.println();  // 개행

			String convert = new String(name.getBytes("euc-kr"),"utf-8");  // 이렇게 하면 안됨~!!! check~!!! 
																			// 영어로 해석하고 중국어로 불러오는 격

			System.out.println("value 3 : " + convert);
			//--==>> value 3 : ????  //--전환이 안대면 물음표로 나옴!! 표현할 방법 없음!

			buf = convert.getBytes();
			System.out.println("Length : " + buf.length);
			//--==>> Length : 4   //--원래는 6

			buf = convert.getBytes("utf-8");
			System.out.println("Length : " + buf.length);
			//--==>> Length : 12  //--원래는 9

			/*
			※ check~!!!

			euc-kr 을 utf-8로 변환하겠다는 의도로
			위와 같이 코딩을 해버리면
			이러한 변환으로 인해 바이트 배열이 깨져서
			euc-kr 이든...  utf-8 이든...
			어떠한 바이트 배열로 읽어오든
			깨져있는 것을 확인할 수 있다.

			이미 깨져서 생성된 String 객체의 바이트 배열은
			어떤 방식으로든 ★복구가 불가능★하다.

			*/

		
		}
		catch (UnsupportedEncodingException e)   //문제를 냅다 던지는게 아니라 잡아내는것!!
		{
			System.out.println(e.toString());
		}
		///이 구문은 문제가 발생하게 되면 그거에 이름을 붙여서(e) 문제를 해결하겠다. 라고 코드 짠 것! 
		
		
		

	}
}