유니코드란 무엇일까?
인코딩 에러?
꼭 한번은 마주친다는 문제… 분명 한글로 데이터를 받았고 데이터베이스에도 한글 데이터가 잘 저장이 되고 있었다. 그런데?
20220301-_______________________________________________________.xls 왜 한글 파일이 이렇게 저장이 되는걸까…
에러로그에는 다음과 같이 로그가 찍혀있었다.
1 | Encoding::UndefinedConversionError ("\xEC" from ASCII-8BIT to UTF-8): |
분명 나는 한글로 데이터는 들어온다. 그런데 인코딩 문제라고 한다.. 그동안 별 문제 없이 한글 데이터를 사용했는데 뭐 어쨌든 중요한건 한글이 깨진다는 것이다.
해당 문제를 살펴보니 ROR 콘솔에서 발생하지는 않지만 변수에 UTF-8이 아닌 문자를 할당할 경우 발생하는 에러라고 나왔다.
문제 해결을 위해서는 해당 파일을 읽어올때 루비에서는 .force_encoding(‘utf-8’).encode 메서드로 인코딩 후 실행하면 되는 문제였다.
항상 인코딩 문제를 겪을 때마다 문자 인코딩 방식이 달라서 그래! UTF-8 로 인코딩 해주면 해결 되는 문제야! 라고만 생각하며 쉽게 넘어가는 경우가 많았다.
그리고 별로 중요한 문제라고 생각하지 않았던 것도 있다. 해결하면 그만이지 자주 있는 일도 아니고 그때 또 하면 되는걸 인코딩까지 공부해야돼? 라는 생각…
그래서 그냥 알아보기로 했다.
유니코드(UNICODE)는 뭐지?
유니코드는 무엇일까 아스키 코드는 뭘까 항상 UTF-8 EUC-KR 많이 들었는데 이게 유니코드인가?
유니코드란 숫자, 전세계의 문자들을 매핑해놓은 구조이다. 먼저 등장했던 아스키코드는 영어만 매핑되어 표현할 수 있는 문자열의 제약이 존재했다. 전세계의 많은 언어들을 표현하기 위해서 아스키코드가 등장하게 된것이다.
아스키코드에서 대문자 A는 16진수 0x41, 10진수 65로 매핑되어있다. 이러한 형식과 동일하게 유니코드또한 아스키코드에서 표현하지 못하는 문자까지 포함하여 이루어진 코드표인것이다.
간단하게는 A라는 문자가 0x41 인 것을 앞에 U+가 합쳐져 U+0x41로 매핑되어있는 형식이다.
UTF-8
두가지 모두 유니코드를 어떻게 인코딩 할것인지 방식들이다. 가장 많이 사용되는 UTF-8은 8비트를 기준으로 인코딩하는 방식을 작동하는 인코딩 방식이다.
루 라는 한글을 유니코드표에서 찾아보며 UTF-8로 어떻게 인코딩이 되었는지 알아보자
먼저 루는 유니코드 표에서 찾아보면 U+B8E8 이라는 키로 매핑되어있는 문자였다. 그럼 U+B828 을 UTF-8을 통해 인코딩하면 어떤 형식으로 바뀌는 걸까
U+B8E8 은 2진수로 1011 1000 1110 1000 이다. 이때 UTF-8은 3바이트 가변 표기하는 인코딩 방식으로
1110xxxx 10xxxxxx 10xxxxxx에 x 자리에 2진수를 차례대로 넣어주면 된다. 따라서
11101011 10100011 10101000
파란색 자리에 채워넣어주면 되는 것이다.또한 루라는 문자의 UTF-8 값은 235, 163, 168인데 위에서 나온 숫자를 각각 변환하면 11101011 => 235, 10100011 => 163, 10101000 => 168과 일치한다.
이러한 방식으로 비 라는 문자열까지 알아보면
UNICODE => U+BE44
UTF-8: 235, 185, 132;
2진수 1011 1110 0100 0100
3바이트 가변 표현 방식 11101011 10111001 10000100
3바이트 가변 표현방식 2진수 10진수 변환 235, 185, 132 = UTF-8 10진수 3개와 일치
유니코드와 UTF-8에대해 간략하게 어떤식으로 구성되어 있는지 알아보았다.
이처럼 유니코드는 아스키를 포함한 문자 코드 표이고 UTF-8은 해당 문자를 어떤 방식으로 인코딩 할지 결정하는 수단 중 한가지라고 볼 수 있다. 시간이 된다면 인코딩은 어떤 방식으로 이루어지며 어떤 것인지 알아보도록 해야겠다.