이전 글들에서 ASCII 코드와 인코딩에 대해서 정리를 했었다
오늘은 더 확장된 개념인 유니코드와 유니코드를 인코딩하는 방식
UTF(Unicode Transformation Format) 시리즈에 대해서 정리해보려 한다
[이전글 - ASCII코드, 인코딩 등]
1. 유니코드
유니코드는 전 세계의 모든 문자에 대해 고유한 번호를 할당하는 국제 표준이다
이는 다양한 언어와 기호를 하나의 일관된 문자 세트로 표현할 수 있게 해 주고, 유니코드는 현재 전 세계적으로 널리 사용되고 있으며, 인터넷과 다양한 컴퓨팅 시스템에서 문자 데이터를 교환하는 데 필수적 역할을 하고 있다
2. UTF(Unicode Transformation Format) 시리즈
- UTF-8 (현재 가장 많이 쓰임)
UTF-8은 유니코드 문자를 나타내는 데 가장 널리 사용되는 가변 길이 문자 인코딩 방식
UTF-8은 각 문자를 1바이트에서 4바이트 사이로 인코딩하며, ASCII 문자 세트와의 호환성을 유지
- UTF-16
UTF-16은 문자를 2바이트 또는 4바이트로 인코딩하는 또 다른 유니코드 인코딩 방식
주로 자바와. NET 같은 플랫폼에서 내부적으로 사용
- UTF-32
UTF-32는 모든 유니코드 문자를 4바이트로 일관되게 인코딩하고,
이 방식은 메모리 사용량이 더 많지만, 문자 접근 시간이 일정하여 특정 응용 프로그램에서 유용할 수 있다
3. 기타
- EUC-KR
EUC-KR은 주로 한국어를 위한 문자 인코딩 방식
이는 한글, 한자, 라틴 문자 등을 포함하여 한국어 텍스트를 디지털 형식으로 변환하는 데 사용된다
EUC-KR은 과거 한국어 웹 페이지와 문서에서 널리 사용되고 있었는데 현재는 UTF-8로 대체되고 있는 추세
- CP949
CP949는 EUC-KR의 확장으로, 더 많은 한글 문자를 지원한다
마이크로소프트에서 개발했으며, '확장 완성형'이라고 불린다
CP949는 윈도우 운영 체제에서 한국어 지원을 위해 널리 사용되었지만 이것 또한 UTF-8로 대체되고 있는 추세
4. 가장 많이 쓰이고 있는 UTF-8 이 어떻게 변환되는지 알아보자
"티스토리" 글자에 대해서 UTF-8로 인코딩을 한번 해보자
1단계: 유니코드 코드 포인트 찾기
- "티" = U+D2F0
- "스" = U+C2A4
- "토" = U+D1A0
- "리" = U+B9AC
2단계: 유니코드 코드 포인트를 UTF-8로 인코딩
각 유니코드 코드 포인트를 UTF-8로 인코딩하고, UTF-8 인코딩 규칙에 따라, 각각의 코드 포인트는 1바이트에서 4바이트까지 변환될 수 있다
한글 문자는 일반적으로 3바이트로 인코딩!
- U+D2F0 ("티") → ED 8B B0
- U+C2A4 ("스") → EC 8A A4
- U+D1A0 ("토") → ED 86 A0
- U+B9AC ("리") → EB A6 AC
"티스토리"라는 단어는 UTF-8로 인코딩했을 때 다음과 같은 바이트 시퀀스를 가지게 된다
ED 8B B0 EC 8A A4 ED 86 A0 EB A6 AC
UTF-8 인코딩은 유니코드 코드 포인트의 범위에 따라 다음과 같이 구분된다
1. 1바이트 인코딩 (U+0000 ~ U+007F): ASCII 문자에 해당하며, 첫 바이트는 0xxxxxxx 형태를 띤다
2. 2바이트 인코딩 (U+0080 ~ U+07FF): 첫 바이트는 110xxxxx로 시작하고, 두 번째 바이트는 10xxxxxx로 시작
3. 3바이트 인코딩 (U+0800 ~ U+FFFF): 첫 바이트는 1110xxxx로 시작하고, 두 번째와 세 번째 바이트는 10xxxxxx로 시작
4. 4바이트 인코딩 (U+10000 ~ U+10FFFF): 첫 바이트는 11110xxx로 시작하고, 그 뒤를 따르는 각 바이트는 10xxxxxx로 시작
"티" (U+D2F0)를 UTF-8로 인코딩하기
"티"의 유니코드 코드 포인트 U+D2F0은 3바이트 인코딩 범위에 속한다
따라서 우리는 이를 1110xxxx 10xxxxxx 10xxxxxx 형태로 인코딩을 진행
1. 2진수 변환: 먼저 U+D2F0을 2진수로 변환한다 1101(D) 0010(2) 1111(F) 0000(0)
2. UTF-8 형식에 맞게 분할: 이 2진수를 UTF-8 3바이트 형식에 맞게 재구성
- 원본 비트: 1101001011110000
- 3바이트 UTF-8 형식: 1110xxxx 10xxxxxx 10xxxxxx
- 비트를 채워넣는다: 11101101 10001011 10110000
3. 비트 채우기: 빈자리에 해당하는 x를 원본 비트에서 채워 넣는다
- 채워진 형태: 11101101 10001011 10110000
4. 16진수로 변환: 이제 각 바이트를 16진수로 변환
- 11101101 → ED
- 10001011 → 8B
- 10110000 → B0
따라서, "티" (U+D2F0)의 UTF-8 인코딩은 ED 8B B0으로 완성
5. 한 가지 의문점은 EUC-KR, CP949등이 주로 한국어를 위한 문자 인코딩 방식이라고 했는데 UTF-8로 대체되는 이유는 뭘까
결론적으로는 UTF-8로의 전환은 인터넷의 글로벌화와 기술 발전에 따른 자연스러운 진화로, 사용자와 개발자 모두에게 더 넓은 호환성과 편의성을 제공하기 때문인데 아래의 각각의 인코딩의 특성을 알면 좀 더 이해가 될 것 같다
- EUC-KR의 특성
- 지역적 제한성: EUC-KR은 한국어 처리에 특화된 인코딩 방식으로, 한글과 한자 등을 포함한 2350자 만을 표현할 수 있다 이는 초기 한국어 전자 통신과 문서 처리에는 충분했지만, 글로벌 커뮤니케이션과 다양한 언어의 문자를 포함하는 현대 인터넷 환경에서는 제한적
- 확장성의 한계: EUC-KR은 확장성에 제한이 있어, 새로운 문자나 기호를 추가하기 어렵다 이로 인해 다국어 처리나 새로운 기호가 필요할 때 불편함이 따르게 되었다
- UTF-8의 특성
- 글로벌 사용: UTF-8은 전 세계의 모든 문자를 표현할 수 있는 유니코드를 기반으로 한 인코딩 방식이다 이는 다국어 환경에서의 통신, 문서 작성, 웹 개발 등에 있어 광범위한 호환성을 제공한다
- 가변 길이 인코딩: UTF-8은 가변 길이 인코딩 방식을 사용하여, 문자에 따라 1바이트에서 4바이트까지를 사용 이는 영문 알파벳과 같은 기본 문자는 적은 공간을 사용하면서도, 다양한 국제 문자를 효율적으로 표현할 수 있게 한다
- 인터넷 표준 호환성: UTF-8은 웹 표준과도 잘 맞아, HTML, XML 등에서 기본 인코딩으로 권장되며, 이로 인해 웹 개발 과정에서의 호환성 문제를 줄일 수 있습니다.
- UTF-8로의 전환 이유
- 글로벌 커뮤니케이션: 인터넷의 글로벌화로 다양한 언어의 문자가 혼용되는 환경에서, UTF-8은 모든 문자를 하나의 통일된 방식으로 처리할 수 있게 해 준다
- 기술적 호환성: 현대의 컴퓨터 시스템, 소프트웨어, 인터넷 표준 등은 대부분 UTF-8을 지원하고 권장하며, 이로 인해 개발자와 사용자 모두에게 편리함을 제공
- 확장성과 유연성: 새로운 문자나 이모지 등을 추가할 때 UTF-8은 쉽게 확장할 수 있으며, 이는 지속적으로 변화하는 디지털 커뮤니케이션 요구를 충족시킬 수 있다
'IT > 문자인코딩' 카테고리의 다른 글
인코딩(Encoding)/디코딩(Decoding), MIME, Base64, 쉽게 이해하기 (0) | 2024.05.31 |
---|---|
바이너리(Binary), 바이트(Byte), 아스키(ASCII) 코드에 대한 정리 (0) | 2024.05.31 |
URL 인코딩 이란? URL 인코딩에 대해 쉽게 이해하자 (0) | 2024.05.30 |