일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- @tistory.com
- 비밀번호 유효성
- 스팸글 차단
- 스크롤 이동
- column명비교
- 암호화&복호화
- 청보리밭
- PADDING
- Java
- POST 전송
- 네이버 지도API
- 중복필드
- 치환
- 고창
- 2012 사진공모전
- fckeditor
- addbatch
- XSS 차단
- 일괄처리
- 자동 로봇 글등록
- 자바스크립트
- 클라우드
- CSS
- MARGIN
- 퀵메뉴
- html5
- 배경이 가려진 레이어 팝업
- 다음메일
- WEB-INF 노출
- apache tomcat 연동 보안
Archives
- Today
- Total
그곰의 생활
EUC-KR 과 UTF-8 비교 본문
(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