맡고 있는 업무 특성상 종종 문자열이 깨지는 이슈를 격는다. 그럴 때마다 단순히 아! 이거 문자열 인코딩이 이슈네 하고 넘어갔었다. 그러던 중 갑자기 문자열 인코딩이 정확이 멀까?에 대해 의문이 들었고 그래서 다시 한번 정리해 본다.
문자와 숫자가 매핑된 표. euc-kr은 통합형 한글 코드(Unified Hangul Code)라는 문자집합을 기준으로 하고 utf-8/utf-16/utf-32는 unicode를 기준으로 한다. 즉 문자를 숫자로 나타내는 rule 이다.
컴퓨터는 당연히 우리가 사용하는 문자를 이해할 수 없기때문에 사람이 사용하는 모든 문자를 바이트 코드로 표현 해야 한다. 이 변환하는 과정을 문자열 인코딩이라고 부른다. 즉 문자에 해당하는 숫자를 binary data로 나타내는 rule 이다. 구체적으로는 몇 bit로 숫자를 나타낼 것인가 정하는 것이다.
문자열 인코딩에는 euc-kr,utf-8,utf-16,cp949등이 있다.
참고로 cp949는euc-kr의 문자집합를 모두 포함해서 확장한 문자집합이다.
euc-kr과 utf-8을 기준으로 설명하겠다.
euc-kr
통합형 한글 코드 문자집합에서 원하는 문자의 미리 정해진 숫자를 찾는다 그다음 이진수 값으로 변환한다.
예) '가'-> (10진수 45217/16진수 B0A1) -> 10110000 10100001
utf-8
utf-8도 동일하게 유니코드라는 문자집합에서 원하는 문자의 정해진 숫자를 찾는다. 그리고 똑같이 해당 숫자를 이진수 값으로 변환한다. 그리고 utf-8은 euc-kr과 다르게 이진수 값을 한번 더 utf-8방식으로 인코딩한다.
예) '가'-> (10진수 44032/16진수 AC00)-> 10101100 00000000 -> 11101010 10110000 10000000
(자세한 utf-8변환 방식은 생략한다.)
확실하지는 않지만 여기저기 찾아본 결과 아래와 같은 이유라고 한다.
10101100 00000000
위와 같은 uicode의 이진수 값이 있다고 하면 컴퓨터는 어디까지가 한개의 문자인지 인식하기 어렵다. 10101100가 한 개 문자인지, 10101100 00000000가 한 개의 문자인지 파악하기 어려울 것이다. 그래서 utf-8/16이라는 인코딩 방식을 이용해 정해진 구격(알고리즘에)맞춰 이진 데이터로 다시 변경한다. utf-8의 경우 첫 번째 바이트를 통해 한 문자열의 크기를 알아낼 수 있다.그렇다면 개인적인 궁금증은 euc-kr 또한 1-2byte로 가변 크기인데 왜 별도의 인코딩을 한 번 더 진행하지 않는 것일까?
https://stackoverflow.com/questions/3951722/whats-the-difference-between-unicode-and-utf-8
https://ko.wikipedia.org/wiki/UTF-8
https://stackoverflow.com/questions/47826439/why-cant-we-store-unicode-directly
https://deliciousbrains.com/how-unicode-works/