요즘 일을하면서 중개서버 Socket 과 Api의 흐름을 보면서 그림을 그리라는 미션을 받아 수행하던중 문득 왜 EUC-KR로 받아서 왜 굳이 UTF-8로 변환과정을 하지? 처음부터 받으면 안되나?? 에서 비롯된 궁금증으로 이글을 씁니다.
보통 한글이 깨졌다고 하죠. 개발을 하다 보면 한글이 제대로 표현된 프로젝트를 import 시켰을 때 아래 그림처럼 한글이 깨지는 경험이 있으실 겁니다.
대체 이런 상황은 왜 발생하는 것일까요? 그 이유는 컴퓨터에서 한글을 표현하는 다양한 문자열 셋과 인코딩 방식들이 맞지 않기 때문입니다.
가장 초창기에서 사용하는 문자열 표 아스키코드에는 미국에서 사용되는 숫자나, 알파벳만 들어있었기 때문에 한글과 같은 다른 문자 체계는 표현이 불가능했습니다. 그래서 나라들마다 문자열 표를 다 각각 만들었습니다. EUC-KR도 이때 탄생한 문자열 셋이며 아스키코드가 1byte였던 것과는 달리 2byte(16bit)으로 이루어져 있습니다.
EUC-KR의 문자열 표는 위와 같습니다. 한글 '가'는 'b0 a 1'로 대응됩니다. EUC-KR 코드표에는 한글뿐만은 아니고 특수 기호, 영문, 한문, 일어 등이 함께 정의되어 있습니다. 하지만 이 EUC-KR도 문제가 많았습니다. 이렇게 각각의 나라마다 문자열 셋을 다 따로 만들게 되면 인코딩이 통일되지 않아서 문자가 깨지는 현상이 자주 발생하고 EUC-KR에는 정의되어 있지 않은 태국어와 같은 외국어는 표현할 수 없기 때문에 한글 + 태국어를 동시에 표현할 수가 없는 문제도 발생합니다. 이러한 문제들을 해결하기 위해서 전 세계 문자를 모두 하나로 통합한 문자열 셋을 만들었습니다. 그것이 바로 유니코드입니다. UTF-8이 이 유니코드에 해당합니다.
유니코드는 전세계 모든 문자를 이 유니코드에 하나로 합친 것으로 한글, 일본어, 중국어, 태국어 심지어는 이모티콘까지 표현이 가능해졌습니다.
한글 유니코드의 문자열 표는 위와 같습니다. 한글 '가'는 'AC00'으로 대응됩니다. 유니코드 인코딩 방식에는 대표적으로 UTF-8, UTF-16, UTF-32등이 있고 이 중에서 ASCII와 호환이 가능하면서 가장 크기가 가벼운 UTF-8을 많이 사용합니다.
UTF-8은 유니코드 범위에 따라 1~4byte로 인코딩하는 가변 크기 인코딩 방식입니다. 사용빈도가 높은 글자는 적은 저장 공간을 차지하고 사용빈도가 낮은 글자는 많은 저장 공간을 차지하게 만들어졌습니다.
즉 요즘 개발되는 프로젝트는 대체로 UTF-8을 사용합니다. 따라서 우리도 UTF-8을 사용하여 인코딩 문제가 생기지 않도록 방지하는 것이 좋겠습니다. 다만 UTF-8을 사용하면 용량이 다소 늘어나는 문제는 있습니다. EUC-KR에서는 한글 1자가 2byte이지만 UTF-8에서는 한글 1글자가 3byte이기 때문입니다.
결론적으로 이걸보며 제가 느낀건 지금 보고있는 중개서버가 EUC-KR 로 받는 이유는 답이 아닐수도 있지만 이런 큰 단위 프로젝트에서 1byte가 속도를 좌지우지해서 그런건지 아니면 사용해온 시간이 길어서 호환성 때문인지 두개중 하나일것 같습니다 아니면 답 좀 알려주세요 ㅠ