http://ncanis.tistory.com/19 이글을 보면, ansi unicode utf8 에 대해 자세히 나오네요.
아래내용은 저가 이해한부분만 발췌,수정한거라서, 원본을 보시면 더 이해가 쉬울듯 하고요.
글 맨아래 링크글도 자세한 내용이 많네요....
character set(문자집합, 문자셋) - ASCII 코드, 유니코드
표준, 규정 - ANSI, ISO,
인코딩 종류 - UTF-7, UTF-8, UTF-16, EUC-KR,
character set
SBCS(Single Byte Character Set), 1바이트 -> ASCII, ANSI-949,
DBCS(Double), 2바이트 -> CP949, EUC-KR,
MBCS(Multi Byte Character Set), -> SBCS 와 MBCS 같이사용
WBCS(Wide Byte Character Set), 여러바이트 -> CP1200(unicode), CP65001(UTF-8),UTF-16,
문자셋
http://blog.naver.com/proai?Redirect=Log&logNo=20018729436
http://blog.naver.com/m30winjv/90037004637
http://ncanis.tistory.com/19
1. ASCII 코드
1byte로 표현하는 ASCII 코드
0~127 까지이다, (글자는 32~127로 표현한다.)
1byte는 -127~127 까지 총 2의 8승, 256개 이니 1byte로 된다. 물론 영어만.
2의 보수면 0~255까지, 총 7비트로 표현 가능하니 마지막 비트는 다른나라 사람들이 알아서 써라.
이 영어 문자를 제외하고 나머지 128~255를 맵핑하면서 문제는 시작된다.
예를들어서, 미국 pc의 128~255 bit 값에 대한 맵핑과 이스라엘의 pc의 맵핑이 틀리면
메일을 보내면 resume => ?????? 같이 보여지게 될 것이다.
즉, 서로 제각각으로 이 1bit를 사용했다는 것임.
이런 문제점을 통합해서 표준화 한것이 ANSI 이다. 128~256을 어떻게 사용할껀지에 대한 규약이다.
즉 이스라엘은 ANSI-862를 쓰고, 우리나라는 ANSI-949, 영어는 ANSI-437을 쓴다.
즉 코드페이지란 개념으로
코드페이지 949번은 128~255를 한글로 맵핑했다. 한글을 사용하는 사람들은 949로 맵핑해서 써라 이뜻이다.
2. 유니코드
아시아권의 글자(한글,일본어,중국어)는 1byte로는 택도 없다는것을 알죠?
그래서 나온게 DBCS 라네요
Dobule Bytes Character Set 즉, 나머지 모자라는 문자는 두번째 byte에 저장해라 이얘기다.
이제 유니코드다. 유니코드가 나옴으로써 위의 문제들이 모두 해결된 것이다.
유니코드가 하나의 "문자"를 무조건 2bytes 표현한다고 생각은 오류다.
2bytes 면 2의 16이니 65536까지 표현 가능하네.
자바에서는 하나의 문자(char)를 4byte로 표시한다, 아 C++은 2byte로 처리한다.
유니코드에서 글자는 코드 포인트라는 단순히 이론적인 개념으로 사상한다.
즉 A가 0100 0001 1byte로 이렇게 표현되지만,
만약 폰트가 달라지면 어떻게 할까
A 와 a 와 이상한 a 등등 A를 의미하는 것은 같지만, 모두 다르다.
즉 관념적인 A 다.
즉 폰트가 달라져도, 유니코드 페이지 값은 동일하다.
윈도우에서 실행>charmap 을 치면 이게 나온다.
보면 H 를 선택했는데 문자코드가 0x48 이라고 나온다.
만약 폰트를 다른걸 선택해도 관념적인 H는 0x48 동일하다. 이런 관념적인 문자 코드 번호를 코드포인트 라고 한다.
U+0048 이게 정확한 "H" 의 코드 포인트 인다.
이렇게 관념적으로 문자를 지정하니 폰트가 달라져도 모양만 바뀌게 되는것이다.
생각해보라. 우리가 사용하는 한글폰트들 얼마나 많은가. 그걸 몽땅 몇바이트에 넣어 사용한다면 ?
즉 H를 다른 폰트로 바꾸어도 코드포인트는 U+0048 동일하다.
여기서 문제가 있다. 이런 코드 포인트를 저장해야한다.
0048 이니 2byte에 저장하는 것이다.
즉 00(1byte), 48(1byte)
여기서 리틀 엔디안과 빅 엔디안의 개념이 나온다. 각 컴퓨터에서 좀더 빨리 돌리기 위해 이 순서를 바꾼것이다 . 네떡(네트워크)하시는분들 아시죠?
* 리틀 엔디안과 빅 엔디안은 조나단 스위프트의 걸리버 여행기에 나오는 이야기로 삶은 달걀을 둥근쪽을 깨서 먹는 사람 Big Endian 과
뾰족한 쪽을 깨서 먹는 사람들 Little Endian 로 나누어 정치적 대립을 벌이는 소인국 이야기에서 유래 되었다.
즉 00 48 대신에 48 00 으로 쓰는 것이다. (리틀엔디안, 빅 엔디안)
그럼 이렇게 되면 무엇이 필요할까, 이 문자가 과연 리틀인지 빅인지 알아야 할꺼 아닌가
그래서 문자열 맨앞에 유니코드 바이트 순서표시를 붙였다. 그래야 서로 호환해서 바꾸던지 말던지 할꺼다.
3. UTF - 8
자아 여기서 문제다. 미국국적 즉 영어권 프로그래머들은 머가 불만일까
그들은 영어라 1byte면 표현 가능하다. 근데 매 문자 마다 2byte로 표현해야 하니 불만인거다.
저장공간 낭비라면서..
그래서 나온게 UTF-8 이다. UTF-8 은 0~127 사이에 존재하는 모든 코드 포인트들을 단일 바이트로 저장한다.
128이상인것은 2byte 째, 3byte째로 해서 최대 4byte 까지 확장해서 저장한단다.
이러면 영어권에서도 기존 ASCII와 똑같이 맞아 떨어지니 굳이 바꿀필요 없다는 거다.
4. 인코딩
항상 이게 문제다. 왜 한글로 메일을 보냈는데, 받는쪽에서 깨져보일까.
=> 이건 보낼때 이 문자열이 어떤 인코딩방식인지 안알려줘서 그렇다.
(UTF-8, ASCII, ISO 8859-1(라틴), 윈도우1252(유럽) 도대체 어느것?)
이메일인경우 헤더에 "Content-Type: text/plain; charset="UTF-8" 같이 적어주면 된다.
HTML도 마찬가지다.
(근데 우낀게 태그선언을 안해도 한글로 보인다. 왜냐면, 윈도우가 자주쓰는 빈도를 파악해서 인코딩 해준단다.)
* 모든 문자를 표기하려면 UTF-8 을 써라. euc-kr로 표현 불가능한 문자 많다.
* euc-kr이나 ksc5601는 서로 같은 의미이다.
인코딩에서 코드 페이지 (CP) 번호
CP 949 Korean (UHC(통합완성형, 확장완성형)), 로마자 및 한국어(11,172 자), 일본어와 한자 표현
한글을 표현하는데는 2바이트를 사용하며 첫번째 바이트는 0×81~FE 사이, 두번째 바이트는 0×41~5A, 0×61~7A, 0×81~FE 영역을 차지한다.
CP 1200 Unicode, 전세계 모든문자 표현, 한국어(11,172 자)
CP 1201 Unicode (Big-Endian)
CP 1361 Korean (Johab)
CP 10003 Korean (Mac)
CP 12000 Unicode UCS-4 Little-Endian
CP 12001 Unicode UCS-4 Big-Endian
CP 20833 IBM EBCDIC (Korean Extended)
CP 20949 Korean Wansung (EUC-KR = 완성형), EUC(Extended Unix Code)계열은 unix에서 유래, 로마자 및 한국어(2,350자 정도), 일본어와 한자 표현
한글을 표현하는데는 두 개의 바이트를 사용하며, 첫번째 바이트와 두번째 바이트 모두 0xA1~0xFE 사이의 값을 가진다
CP 50225 Korean (iso-2022-kr)
CP 50933 Korean Extended and Korean
CP 51949 Korean (EUC)
CP 65000 Unicode (UTF-7), unicode 의 mail safe version.
CP 65001 Unicode (UTF-8), 이론적으로 모든 unicode character 를 표현, 한글자에 1~4바이트,
한글은 UTF-8 로 표현하게 될 경우 한 글자 당 3 바이트 씩을 차지하게 됩니다.한국어(11,172 자)
CP 65005 Unicode (UTF-32)
CP 65006 Unicode (UTF-32 Big-Endian)
한글과 관련된 토론
http://forum.standardmag.org/viewtopic.php?pid=3866
컴퓨터속의 한글
http://b.mytears.org/2005/01/101
위키백과, UTF-8
http://ko.wikipedia.org/wiki/UTF-8
유니코드 차트
http://www.unicode.org/charts/
[출처] ansi unicode utf8... (powerpro 정보 나눔터) |작성자 두부김치