문자 인코딩 기초
구닥다리 내용이라 오히려 쥬니어들은 잘 몰랐었다고 함
문자 인코딩 기초
- ASCII(American Standard Code for Information Interchange)
- https://stepbystep1.tistory.com/10
- 영어, 숫자, 특수 문자 일부
- 원래 7 bit
- 0000000 ~ 1111111
- ISO 8859
- 7 bit 앞에 1 bit 짜리 0을 붙여서 8 bit = 1 byte
- 00000000 ~ 01111111(0x00~0x7F)
- 예시
- Y e s !
- 0x59 0x65 0x73 0x21
- Y e s !
- EUC-KR(Extended Unix Code-KR)
- 표
- 영문, 숫자, 특수 문자 일부
- 1 byte
- ASCII와 동일. 즉, ASCII(0x00~0x7F)와 호환
- 단, 0x5C의 경우 원래 ASCII에서는 역슬래쉬(”\”)이나, EUC-KR에서는 원화(“₩”)로 표시함
- KS X 1003
- 단, 0x5C의 경우 원래 ASCII에서는 역슬래쉬(”\”)이나, EUC-KR에서는 원화(“₩”)로 표시함
- 한글, 한자 일부, 특수 문자 일부
- 2 byte
- (0xA1~0xFE)(0xA1~0xFE)
- 한글은
- 0xB0A1~0xC8FE
- 예시
- 밀 가 루 3 g
- 0xB9 0xD0 0xB0 0xA1 0xB7 0xE0 0x33 0x67
- 밀 가 루 3 g
- 2 byte
- KS X 1003 값의 범위(0x00~0x7F)와 한글, 한자, 특수 문자 일부 값의 범위(0xA1~0xFE)가 다르기 때문에 문자열 중 랜덤하게 1 byte 값을 살펴 봤을 때, 바로 영문인지 영문이 아닌지 알 수 있음
- 한글 값의 범위가 연속적으로(0xB0A1~0xC8FE) 특정되며, 범위 안에서 한글들도 순서대로(가~힝) 정렬되어 있음
- 전체 한글 11172자 중 2350자만 표현 가능
- 뷁, 똠, 롹 등의 단어 표현 불가
- 문자열 스트림 중 랜덤하게 1 바이트만 읽어본 후, 해당 바이트의 앞 뒤, 어떤 바이트를 붙여서 한글을 표현할지 판단 못함
- CP949(Code Page 949)
- 표를 5개의 페이지로 나눠 만들어 놨음
- http://www.i18nl10n.com/korean/cp949l.html
- 3개 페이지는 EUC-KR 코드와 동일(Special Symbols, Chinese Characters, 2350 Hangul Syllables)
- 2개 페이지는 추가 한글 코드(Additional Hangul Syllable Set 1, Additional Hangul Syllable Set 2)
- 확장 완성형(Unified Hangul Codeset)이라고도 함
- CP949를 그냥 EUC-KR로 부르기도 함
- 표현하지 못했던 한글 8822글자(11172-2350)를 사용하지 않았던 2 byte에 구겨 넣음
- 2 byte
- (0x81~0xC6)(0x41~0x5A, 0x61~0x7A, 0x81~0xFE)
- 빈 공간에 구겨 넣은 것이기 때문에, 한글 값의 범위를 연속적으로 특정할 수 없음
- 범위 안에서 한글들이 정렬 안되어 있음
- 문자열 스트림 중 랜덤하게 1 바이트만 읽어본 후, 해당 바이트의 앞 뒤, 어떤 바이트를 붙여서 한글을 표현할지 판단 못함
- 표를 5개의 페이지로 나눠 만들어 놨음
- 유니코드
- 각 나라의 문자를 섞어 쓰고 싶다
- 고정된 문자 코드의 필요성
- 2 byte x 17 페이지(0~16 plain)
- 0x0000~0xFFFF
- 0 plain
- 기본 다국어 평면(basic multilingual plane)
- 대부분의 문자 코드가 여기에 존재
- 1 plain
- 보조 다국어 평면(supplementary multilingual plane)
- 2 plain
- 보조 상형 문자 평면(supplementary ideographic plane)
- 3~13 plain
- 예비
- 14~16 plain
- 그 외
- 0 plain 이외의 문자에는 문자 앞에 plane 번호를 붙인다
- 0xB0000 → 0 plain
- 0x10B0000 → 16 plain
- 0 plain 이외의 plain에 있는 문자를 표현하기 위해서는 2 byte로 모자르다
- 각 나라의 문자를 섞어 쓰고 싶다
- UCS(Universal Character Set)-2
- plain 0만 씀
- 2 byte
- HTML Entity Number에 사용됨
- 예시
-
가
→ 가
-
- 예시
- plain 1~plain 16 내 문자는 사용 못함
- UTF(UCS Transformation Format)-32
- UCS-4 는 문자 집합의 표준. UTF-32는 그걸 표현하기 위한 인코딩 방식인데 그냥 UCS-4를 UTF-32 라고 부름. 나중에 UCS-4에 뭔가 추가 되면 UTF-32와는 달라질 것
- 4 byte
- plain 2 byte + 문자 코드 2 byte
- 예시
- 가 → 0x00 0x00 0xAC 0x00
- 4 byte는 너무 크다
- UTF-16과 구분할 수 없기 때문에 HTML5에서는 사용 금지 됨
- UTF-16
- 2 byte ~ 4 byte
- 0 plain의 문자는 그냥 2 byte로 씀
- 1 plain~16 plain의 문자는 4 byte로 쓰는데, 인코딩 해서 씀
- 0 plain의 0xD800(1101100000000000)~0xDB7F(1101101101111111), 0xDC00(1101110000000000)~0xDFFF(1101111111111111) 사이는 비어 있음
- 1 plain~16 plain의 값을 인코딩해서 4 byte의 앞 6 bit를 110110 또는 110111로 만듬
- 왜 이렇게 할까?
- 문자열 스트림 중 랜덤하게 2 바이트만 읽어봤는데, 그 중에 110110 또는 110111로 시작하는 바이트가 있다면, 그건 plain 1~plain 16에 위치한 4 byte 짜리 문자일 것이다
- 그렇지 않다면 plain 0에 위치한 2 byte 문자일 것이다
- UTF-8
- UTF-16 다 좋은데 ASCII와 호환이 안됨
- UTF-16의 문자열 스트림에는 중간에 0x00이 있을 수 있음. 따라서 프로그래밍 할 때 까다로움
- ASCII 영역(0x00~0x7F)은 1 byte 문자
- 기본 다국어 평면(plain 0)의 문자는 2 byte~3 byte
- 0x0080~0x07FF 까지는 2 byte 문자
- 3 bit가 110으로 시작되도록 인코딩
- 0x0800~0xFFFF 까지는 3 byte 문자
- 4 bit가 1110으로 시작되도록 인코딩
- 0x0080~0x07FF 까지는 2 byte 문자
- 기본 다국어 평면 외의 문자는 4 byte로
- 5 bit가 11110으로 시작되도록 인코딩
- 문자열 스트림 중 랜덤하게 1 바이트를 읽어보면, 문자의 성격을 알 수 있다
- 시작 1 bit가 0이면, 1 byte ASCII 문자
- 시작 3 bit가 110이면, 2 byte 문자
- 시작 4 bit가 1110이면, 3 byte 문자
- 시작 5 bit가 11110이면, 4 byte 문자
- 시작 2 bit가 10으로 시작하면, 어떤 문자의 중간 부분
- 참고