Python의 아스키코드와 유니코드에 대해 알아봅니다.
아스키코드
- 컴퓨터는 오직 숫자만 이해할 수 있기 때문에 문자를 처리하려면 특별한 방법이 필요하다.
- 과거부터 지금까지 사용하는 유일한 방법 -> 문자와 숫자를 1:1로 매칭시키는 문자 셋(character set)을 만들기.
- 예) 숫자 65는 'A', 숫자 66은 'B'와 같이 숫자마다 문자를 매핑해 놓으면 컴퓨터는 해당 숫자를 문자로 대체하여 인식.
- 초기 컴퓨터 시대에는 각 회사마다 서로 다른 문자 셋을 만들어 사용. -> 호환성 문제.
- 1960년대 미국에서 아스키(ASCII, American Standard Code for Information Interchange)라는 표준을 만들었다.
- 전 세계 모든 컴퓨터가 같은 규칙을 사용하도록 한 최초의 문자 셋 표준.
- 총 128개의 문자를 지원: 영문 대소문자, 숫자, 특수문자를 포함하여 영어권 국가에서 사용하는 모든 문자를 처리하는 데는 부족함이 없었다.
유니코드
- 아스키의 한계: 128개 문자로는 한글, 중국어, 일본어, 아랍어 같은 다른 나라의 문자들을 표현할 수 없다.
- 각 나라에서는 자신만의 문자 셋을 만들기 시작했다.
- 한국: 한글과 한자를 처리하기 위한 KSC5601
- 일본: 히라가나와 가타카나, 한자를 위한 JIS
- 중국: 중국어 간체를 위한 GB2312
- 한국 컴퓨터에서 만든 문서를 일본 컴퓨터에서 열면 글자가 깨져 보였고, 한글과 중국어를 같은 문서에 함께 쓰는 것도 불가능. -> 각 나라 웹사이트를 보려면 매번 다른 설정을 해야 하고, 잘못 설정하면 깨진 글자.
- 1990년대에 유니코드(Unicode) 등장.
- 유니코드는 전 세계 모든 문자를 하나의 거대한 표에 정리하자는 아이디어에서 출발.
- 현재 유니코드는 100만 개 이상의 문자를 지원할 수 있도록 설계되어 있으며, 한글, 중국어, 일본어, 아랍어는 물론 이집트 상형문자와 이모지까지 포함하고 있다.
- 유니코드가 전 세계 표준으로 자리 잡으면서 이제 한 문서에 "Hello 안녕하세요 こんにちは 你好"처럼 여러 나라 언어를 자유롭게 섞어 쓸 수 있게 되었다.
유니코드로 문자열 다루기
- 파이썬은 버전 3부터 모든 문자열을 유니코드로 처리한다.
- 인코딩: 유니코드 문자열을 바이트 문자열로 바꾸는 것.
- 유니코드 문자열은 인코딩(encoding) 없이 그대로 파일에 적거나 다른 시스템으로 전송할 수 없다.
- 유니코드 문자열은 단순히 문자 셋의 규칙이기 때문.
- 파일에 적거나 다른 시스템으로 전송하려면 바이트(byte) 문자열로 변환해야 한다.
- 디코딩: 바이트 문자열을 유니코드 문자열로 바꾸는 것.
- 파일을 읽거나 네트워크를 통해 바이트 문자열을 수신할 때는 해당 바이트가 어떤 방식의 인코딩을 사용했는지를 미리 알아야만 디코딩할 수 있다.
인코딩하기 encode()
- 유니코드 문자열을 바이트 문자열로 바꾸는 방법.
- 인수를 생략하면 기본값인 utf-8로 동작한다.
a = "Life is too short"
b = a.encode('utf-8')
b
type(b)
디코딩하기 decode()
- euc-kr로 인코딩한 바이트 문자열을 utf-8로 디코딩하려 한다면 오류.
입출력과 인코딩
: 파일을 읽거나 네트워크를 통해 데이터를 주고받을 때 추천하는 방법.
- 입력으로 받은 바이트 문자열은 되도록 빨리 유니코드 문자열로 디코딩한다.
- 함수나 클래스 등에서는 유니코드 문자열만 사용한다.
- 입력에 대한 결과를 전송하는 마지막 부분에서만 유니코드 문자열을 바이트 문자열로 인코딩해서 반환한다.
이와 같은 규칙을 지킨다면 인코딩과 관련해서 큰 어려움은 없을 것이다. (다중 인코딩되거나 문자열이 꼬여 버리는 불상사가 발생하기도 한다.)