그곰의 생활

EUC-KR 과 UTF-8 비교 본문

Server-side

EUC-KR 과 UTF-8 비교

그곰 2011. 7. 7. 18:28


(1) 보통의 한국어 텍스트 문서(euc-kr,ANSI) : 이것은 아스키 문서이며 유니코드가 아닙니다. 영문/숫자/기호는 1바이트. 한글과 한자는 2바이트로 표현됩니다. euc-kr 또는 ksc_c_5601-1987 로 불리는 인코딩이며 웹페이지 작성에 사용할 수 있습니다. 특수한 외국어 문자나 일본식/중국식 한자는 표현할 수 없습니다.

다음의 2개가 유니코드입니다:

(2) 일반 유니코드(Unicode): 모든 글자를 2바이트로 표현합니다. 전세계 모든 글자들을 한꺼번에 표현할 수 있습니다. 인터넷에 HTML 파일로 올릴 수 없습니다. 즉 웹페이지 작성에 쓸 수 없습니다.

(3) UTF-8 유니코드: 영문/숫자/기호는 1바이트로, 한글과 한자 등은 3바이트로 표현합니다. 전세계 모든 글자들을 한꺼번에 표현할 수 있습니다. 웹페이지 작성에 쓸 수 있습니다. (저의 mwultong.blogspot.com 이 블로그도 UTF-8 로 되어 있습니다)



MS윈도우2000/XP 이상에서는, 외부적으로는 '일반 아스키 인코딩(1번)'을 사용하고, 내부적으로는 '일반 유니코드(2번)'를 사용합니다.

유닉스/리눅스/오픈소스 진영에서는 (1)번 또는 'UTF-8 유니코드(3번)'를 기본으로 사용합니다.



문자열 JAVA 소스
String str = "김학일";

byte[] buf = str.getBytes();
// 유니코드인 str을 시스템 디폴트 인코딩 방식으로 인코딩
byte[] buf2 = str.getBytes("UTF-8");

// 유니코드인 str을 UTF-8 형식으로 인코딩 (인코딩 정보는 원하는 것을 임의로 넣을 수 있음)
String str1 = new String(buf);

// 바이트 배열이 시스템 디폴트 방식으로 인코딩 되어있음을 알려 줌.
String str2 = new String(buf2, "UTF-8");

// 바이트 배열이 "UTF-8" 방식으로 인코딩되어 있음을 알려 줌. UTF-8로 바꾸라는 의미가 아님.
// 즉, 뒤의 "UTF-8"은 임의로 넣을 수 있는 것이 아니고, decoding하는 놈에게 정보를 제공하는 것임.

byte []b = new byte[]{-21, -117, -76, -21, -78, -68, -21, -99, -67};
String c = new String(b, "utf-8"); // new String(b, "UTF-8")
System.out.println("Result:" + c);

Charset cset = Charset.defaultCharset();
String csetName = cset.name();
System.out.println("default charset:" + csetName);

System.out.println("system default encoding : " + System.getProperty("file.encoding"));

String s = "나눔";

//이 소스 파일이 저장된 형식은 중요하지 않음. (실제로는 "나눔"을 표현하는 유니코드임)

byte[] bytes1 = s.getBytes();
byte[] bytes2 = s.getBytes("UTF-8"); // utf-8로 저장된 파일과 같음
byte[] bytes3 = s.getBytes("EUC-KR"); // euc-kr로 저장된 파일과 같음

String s1 = new String(bytes1);
String s2 = new String(bytes2, "UTF-8");

// byte2는 utf-8로 인코딩(저장)되어 있으므로, 알아서 잘 디코딩하라는 뜻임.
String s2_ = new String(bytes2);
String s3 = new String(bytes3, "EUC-KR");
String s3_ = new String(bytes3);
String s4 = new String(bytes3, "UTF-8");

// 이것은 깨짐. 왜냐하면 euc-kr로 인코딩된 것을 utf-8로 풀려고 하기 때문임.
System.out.println("default : " + s1);
System.out.println("utf-8(1) : " + s2);
System.out.println("utf-8(2) : " + s2_);
System.out.println("euc-kr(1) : " + s3);
System.out.println("euc-kr(2) : " + s3_);
System.out.println("잘못된 디코딩 : " + s4);





Comments