2018년 10월 25일 목요일

한글 환경에서 자주 접하는 인코딩 정리. (UTF-8, EUC-KR, CP949)

대부분의 출처는 나무 위키. 나무 위키는 볼수록 놀랍다.
https://namu.wiki/w/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C

ASCII: American Standard Code for Information Interchange. 미국 정보 교환 표준 부호. 미국 산업 표준화 단체인 ANSI에서 표준화한 7비트 부호체계. 한글자당 1바이트를 할당하는데 영문 키보드로 입력할 수 있는 모든 기호들이 할당되어 있다. 2바이트 이상의 코드를 표현할 수 없기 때문에 국제표준의 위상은 유니코드로 넘어갔다. 참고로 초기엔 1바이트 중 7비트만 사용했는데 맨 앞 비트는 통신 에러 검출을 위한 Parity Bit로 쓰였다고 한다. 8비트 버전의 확장형 ASCII 코드도 있다. ASCII는 UTF-8과 호환되지만 UTF-16과는 호환되지 않는다.

Unicode: 전 세계의 모든 문자를 다루도록 설계된 표준 문자 전산 처리 방식. Unicode는 문자를 숫자로 매핑하는 것(예를 들어 A는 숫자 65)에 대한 개념이고 Unicode 인코딩으로 UTF-8, UTF-16, UTF-32가 있다. 일반적인 상황에선 Unicode를 UTF-8로 이해해도 무리가 없다. UTF-32의 경우 낭비가 심해 잘 쓰지 않지만 가변 길이를 고려하지 않아도 된다는 장점 또한 존재해 프로그램 내부적으로 사용하는 경우도 있다고 한다.

UTF-8: 가장 많이 쓰이는 가변 길이 유니코드 인코딩 방식. CP65001. 하나의 글자는 1~4 바이트 중 하나로 인코딩 되고, 1바이트 영역은 ASCII 코드와 하위 호환성을 갖는다. 재미있는게 한글의 경우 주로 3바이트 구간에 존재해서 한글로 작성된 문서의 경우 EUC-KR이나 UTF-16으로 저장한 것 보다 UTF-8로 저장했을 때 파일의 크기가 더 커진다.
MS 계열 프레임워크에서 C/C++등을 이용해 비 유니코드의 멀티바이트 캐릭터를 UTF-8 형식으로 변환하기 위해서는 와이드바이트 형식의 완전 2바이트 유니코드로 변환한 다음 다시 UTF-8 플래그를 주어 멀티바이트 형식으로 다시 변환하는 과정이 필요하다.

ANSI: 일반적으로 MS-DOS의 기본 인코딩인 OEM-US 내지 영문 Windows의 기본 인코딩인 Windows-1252를 지칭. 메모장에서 인코딩을 지정하지 않고 저장한 경우 'ANSI'라고 표시되는데 이는 잘못된 표기임. 실제 인코딩은 System Locale을 따라가므로 한글 Windows에선 CP949가 된다.

EUC-KR: 완성형 한글 인코딩 방식 중 하나. 현재 산업 표준이다. 시작은 '가', 끝은 '힝'. 지원하는 한글 글자 수는 2,350자로 현대에 사용되는 한글 11,172자에 비해 부족하다. 나름 빈도를 조사해 2,350자를 선정했다고 하지만 역부족.

CP949: 통합 완성형 (확장 완성형). 한국어판 Windows의 기본 코드 페이지로 EUC-KR의 확장이다. EUC-KR이 지원하지 않던 8000여자를 지원한다. 마이크로소프트가 개발했기 때문에 MS949, Windows-949 등으로 불리기도 한다.

* GCC 같은 비 MS 진영 컴파일러를 이용해 C/C++ 등의 네이티브 프로그래밍 언어를 갖고 UTF-8로 한글 출력을 하면 한글이 깨지는 현상이 있다. 이럴 땐 소스 코드 자체는 UTF-8로 하되, wchar_t 같은 와이드바이트 자료형을 사용해야 한다.

* Nodepad++의 경우 EUC-KR, CP949를 구분하는데 CP949로 작성된 문서를 Notepad++로 열면 시스템 기본 인코딩(ANSI)로 읽히는 경우가 흔해, 한글 버전이 아닌 다른 언어 윈도우에서는 글자가 깨진다고 함.

* BOM : Byte Order Mark. 문서의 처음에 눈에 보이지 않는 특정 바이트를 넣어 문서가 어떤 Endian, 인코딩 방식을 사용하고 있는지 알려주기 위한 장치다. 상황에 따라 이게 오히려 문제를 일으키기도 한다. 유닉스/리눅스 계열에서는 쓰지 않는 것이 관례. 웹 프로그래밍에서도 사용하지 않는 것이 좋다.
 . UTF-8 >> EE BB BF (UTF-8 Signature, 단지 UTF-8로 인코딩되었다는 사실을 알리는 사인.)
 . UTF-16 Big Endian >> FE FF
 . UTF-16 Little Endian >> FF FE
 . UTF-32 Big Endian >> 00 00 FE FF
 . UTF-32 Little ENdian >> FF FE 00 00

[파이썬과 인코딩]
https://datascienceschool.net/view-notebook/250c1869eab54157827adf54c5e9f064/

댓글 없음:

댓글 쓰기