프로그래밍에서 문자열을 다루는 방법
유니코드, 인코딩에 대해 이해하기
ASCII, UTF-8
문자열을 다루는 디테일한 방식에 대해 전부 알 필요는 없지만, 프로그래밍 언어마다 문자열을 다루는 자료형의 차이를 이해하기 위해 문자열을 다루는 기본적인 방식은 알아두자.
유니코드는 인코딩이 아니다.
유니코드(Unicode)는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업표준이다.
기본적으로 유니코드의 목적은 현존하는 문자 인코딩 방법을 모두 유니코드로 교체하는 것이다.
유니코드
는 전세계 거의 모든 문자를 2bytes로 1:1 맵핑 시키는 방식을 말하고, 유니코드를 표현하는 여러가지 인코딩 방식들이 존재한다. 유니코드_목록
UTF-8
, UTF-16
등이 인코딩 방식 중 하나다.
그렇다면 인코딩은 뭘까?
우리가 사용하는 컴퓨터는 0, 1밖에 모르는 바보다.
따라서, 우리가 사용하는 문자를 컴퓨터에 표현하기 위해서는 약속된 규칙에 따라서 0과 1로 변환하는 과정이 필요하다.
이 과정을 인코딩
이라고 한다. 디코딩(Decoding)은 그 반대다.
즉, 인코딩
은 어떤 문자나 기호를 컴퓨터가 이용할 수 있는 신호로 만드는 것이다.
이 신호를 입력하는 인코딩과 문자를 해독하는 디코딩을 하기 위해서는 미리 정해진 기준을 바탕으로 입력과 해독이 처리되어야 하는데, 인코딩과 디코딩의 기준을 문자셋(charset)이라고 한다.
이 문자셋의 국제 표준이 유니코드이다.
American Standard Code for Information Interchange.
ASCII
는 영문 알파벳을 사용하는 대표적인 문자 인코딩이다.
128개의 문자, 7비트로 모든 영어 알파벳을 표현할 수 있다.
왜 8비트가 아닌 7비트를 사용할까?
1byte(8bit) 단위의 통신에서 7비트를 제외한 나머지 1비트는 통신 에러를 감지하기 위한 체크섬으로 사용되었다고 한다.
유니코드
는 ASCII를 확장한 형태이다.
American National Standard Institute.
8비트로 구성되어 있고, 256개의 문자를 표현할 수 있다.
ANSI의 앞 7비트는 ASCII와 동일하고, 뒤의 1비트(CodePage)를 이용하여 영어 외의 다른 언어의 문자를 표현한다.
UTF-8
과 UTF-16
은 인코딩 방식의 차이를 의미한다.
UTF-8
은 Universal Coded Character Set + Transformation Format – 8-bit의 약자로, UTF- 뒤에 등장하는 숫자는 비트(bit)
다.
유니코드를 위한 가변 길이 문자 인코딩 방식 중 하나로서, ANSI
의 단점을 보완하기 위해 만들어졌다.
ANSI
는 다국어를 지원하기 위해 CodePage 정보를 미리 알고 있어야 한다.
UTF-8
은 멀티바이트 개념을 사용하여 하나의 Character Set에 거의 모든 문자를 넣었다.
UTF-8
은 1byte(8bit) 기반이다.
UTF-8
은 유니코드 한 문자를 나타내기 위해 1 byte(=8 bits)에서 4 bytes까지 사용하는, 가변 표기하는 인코딩 방식이다.
네트워크를 통해 전송되는 텍스트는 주로 UTF-8로 인코딩된다.
사용된 문자에 따라 더 작은 크기의 문자열을 표현할 수 있기 때문이다.
UTF-8은 ASCII 코드의 경우 1 byte, 크게 영어 외 글자는 2-3 byte, 보조 글자는 4 byte를 차지한다.
1byte 단위로 확장하며 문자를 표현한다.
이모지는 보조 글자에 해당하기 때문에 4 byte가 필요하다.
UTF-16에 비해 바이트 순서를 따지지 않고, 순서가 정해져 있다.
UTF-16
은 16비트 기반으로 저장하는 UTF-8의 변형이라고 생각하자.
한글의 경우 UTF-8로 저장할 경우 3bytes가 필요한데, UTF-16으로 저장하게 되면 2bytes면 되기 때문에 용량의 이점이 있다.
그러나 경우에 따라서 2bytes 이상을 사용하는 경우가 있어 용량의 이점이 크다고 보긴 어렵다.