티스토리 뷰

 

리듬게임계에서 유명한 음악 중에 명 (冥) 이라는 곡이 있다. 비트매니아 IIDX에서 오랫동안 최종보스의 지위를 지켜왔던 곡으로 그 난이도도 악명높지만 빼어난 곡과 BGA, 그리고 한자 한 글자로 되어있는 강렬한 제목 (...) 으로 비트매니아 뿐 아니라 리듬게임 전체에서도 보스곡하면 가장 먼저 떠오르는 곡 중 하나라 할 수 있다.

 

이 곡은 한국에서 흔히 '뼸' 이라는 별명으로 불리곤 하는데, 그 이유는 저 한 글자짜리 강렬한 제목이 인코딩 오류로 인해 깨지면 '뼸' 이라는 글자로 변하기 때문이다.

이 곡 이외에도 작곡가 'Ryu☆' 은 별이 '걲' 으로 깨진다는 이유로 '류걲' 이라 부른다던가, 타 장르로 넘어가면 '동방 프로젝트' 의 '東方' 이 깨지면 '뱦뺴' 가 되기 때문에 동방을 뱦뺴라고 부르는 등 일본 게임이나 문화 컨텐츠를 많이 접해본 사람이라면 이런 문자 깨짐 현상에 익숙할 것이다.

 

그런데 이런 현상이 '인코딩 오류' 때문에 일어난다는 것까지는 잘 알려져 있지만, 그게 무엇이고 자세하게 어떤 과정을 거쳐 이렇게 문자가 깨지는지 아는 사람은 많지 않을 것 같다.

 


 

1. 문자 인코딩과 문자표

 

먼저 위키피디아에서 인코딩이라는 단어의 정의를 한번 찾아보자.

 

부호화(符號化) 또는 인코딩(encoding)은 정보의 형태나 형식을 표준화, 보안, 처리 속도 향상, 저장 공간 절약 등을 위해서 다른 형태나 형식으로 변환하는 처리 혹은 그 처리 방식을 말한다.

일반적으로 인코딩이라는 단어가 제일 많이 쓰이는 사례는 아마 동영상 편집일 것 같다. 동영상을 어디에 올리거나 보내기 위해서 자르거나 화질을 열화시켜 용량을 줄일 때 '인코더' 라는 프로그램을 사용해본 경험이 있을 것이다. 여기서는 원본 영상 데이터에서 압축되거나 포맷이 변환된 영상 데이터로 변환하는 과정이 인코딩이라 할 수 있다.

 

좀 더 일반적인 의미로 확장하면, 사람이 인지할 수 있는 자료를 컴퓨터가 이해할 수 있는 기계어 (0, 1) 로 변환하는 작업을 통틀어서 인코딩이라 부른다.

 

그럼 문자 인코딩 얘기로 넘어가보자. 컴퓨터는 0과 1을 사용하는 기계이기 때문에 인간이 사용하는 영어 알파벳이나 한글 같은 문자를 직접적으로 이해할 수 없다. 그러므로 컴퓨터로 인간이 사용하는 문자를 표현하기 위해서는 이를 기계어로 변환하는 작업이 필요하고, 어떤 문자를 어떤 기계어에 대응시킬 것인가라는 문제를 해결해야 한다.

 

컴퓨터 산업의 태동기였던 1960년대에 이 문제를 해결하기 위한 최초의 표준인 아스키 코드 (ASCII Code) 라는게 등장했다. 아스키 코드의 예시를 보면서 문자 인코딩이 무엇인지 알아보자.

 

아스키 코드는 위 표에서 볼 수 있듯 128개의 문자를 표현할 수 있으며, 컴퓨터에서 쓰이는 제어문자들 (앞부분) 과 알파벳, 숫자, 자주 쓰이는 특수문자들로 구성되어 있다. 그리고 이 문자들은 각각 특정한 숫자에 대응되어 있다.

 

컴퓨터는 기계어, 즉 2진수를 사용한다고 했는데 왜 표에는 10진수랑 대응되어 있는지 의문을 가질 수 있는데 저 표는 사람이 보기 편하게 그려놓은 것이고 컴퓨터에서는 저 10진수를 2진수로 변환한 값을 쓰게 된다. 예를 들어 'B' 라는 문자는 10진수 71에 대응되며, 이를 2진수로 바꾸면 1000010이다. 

 

아스키 코드의 표현범위인 128개는 2^7에 해당한다. 즉 7비트로 표현할 수 있지만, 아스키 코드는 8비트 즉 1바이트를 사용한다 (C언어 프로그래밍을 해본 적 있다면 char가 1바이트짜리 자료형이라고 배웠던 걸 상기해보자).

처음에는 패리티 비트 (Parity Bit) 라고 해서 에러를 검출하기 위한 비트를 하나 추가해서 8비트였던 것인데, 완벽하게 에러를 잡아낼 수는 없는 원시적인 방법이라 현재는 더이상 쓰이지 않고 그냥 1바이트를 맞추기 위해서 맨 앞에 0을 하나 붙인다.

 

즉, 이 방법에 따르면 'B' 는 컴퓨터에서 '01000010' 로 변환된다. 이렇게 변환하는 방법을 문자 인코딩이라고 하고, 어떤 문자들을 변환할지 정의해놓은 것을 문자셋 (character set), 위 그림처럼 표로 만들어놓은 것은 문자표라고 한다.

 


 

2. 여러 문자 인코딩의 등장과 한글 인코딩

 

그런데 아스키 코드는 아직 미국과 서구권 일부에서만 컴퓨터가 쓰였던 시절에 만들어진 것이다보니, 세계 각국의 다양한 언어들을 표현할 수 없었다. 그래서 컴퓨터가 세계화된 이후에는 각 나라마다 자기 나라 언어를 표현하기 위한 문자표와 인코딩을 만들었다.

 

한국에서는 '조합형' 과 '완성형' 이라는 두 가지 방식이 대두되었는데, 조합형은 한글의 자음과 모음을 각각 코드화하고 글자는 그 조합으로 표현하는 것이고, 완성형은 자음과 모음이 조합된 완성된 글자 하나하나를 코드화하는 것이었다. 각각 장단점이 있었지만 결국 표준으로는 완성형이 채택되었고, EUC-KR이라는 이름으로 표준화되었다. 그리고 마이크로소프트에서는 EUC-KR을 확장하여 CP949라는 인코딩을 만들었고 이를 한글 윈도우에서 기본 인코딩 방식으로 채택하였다.

 

EUC-KR은 현대 한글에서 자주 쓰이는 글자 2350자를 추려서 문자셋을 구성했는데, 이 2350자에 포함되지 않는 글자를 쓰면 제대로 안 나오는 문제가 있었다. '뷁' 같은 문자는 물론이고 일상생활에서 종종 쓰이는 글자들도 깨지곤 했는데, CP949에서는 11172자까지 확장되어 이 문제는 해결되었다.

 


 

3. '冥' 이 '뼸' 으로 변한 이유

 

한국에서 EUC-KR과 CP949라는 인코딩이 사용되었듯 일본에서도 일본어 문자를 표현하기 위한 자기들만의 인코딩을 만들었는데 그 중 대표적인 게 Shift-JIS라는 인코딩이다.

 

이런 식으로 나라마다 독자적인 문자셋과 인코딩 방법을 만들어 쓰다보니 발생한 문제가 바로 문자 깨짐 현상이다. 서로 표현하는 문자의 종류가 다르다보니 기계어, 즉 2진수로는 같은 값이라도 CP949와 Shift-JIS에서 서로 다른 문자를 가리키게 되는 것이다.

 

이제 '冥' 이 어떻게 '뼸' 이 되었는지 직접 문자표를 보면서 알아볼 차례다. 이 페이지에 들어가면 각 나라에서 쓰이는 인코딩 종류별로 문자표를 볼 수 있는데, Shift-JIS를 선택해서 '冥' 을 찾아보자.

 

'96B0' 이라는 줄의 12번째 글자로 '冥' 이 등록되어 있는 것을 볼 수 있다. 이는 이 글자가 16진수 96BB (96B0 + 11) 에 대응된다는 뜻이며, Shift-JIS에서 '冥' 이라는 글자는 96B0을 2진수로 바꾼 '1001 0110 1011 1011' 으로 인코딩된다는 뜻이다.

 

좀 더 쉽게 표현하면 일본에서 '冥' 이라는 글자를 치면 컴퓨터에는 '1001 0110 1011 1011' 으로 저장되었다는 것이다.

 

이 파일을 한국에서 읽는다면? '1001 0110 1011 1011' 을 한국에서는 한국에서의 표현 방식을 적용해서 읽으려고 할 것이다. 즉, CP949 인코딩으로 읽는다는 것이다. 위 페이지에서 ks_c_5601_1987이라고 표시된 인코딩을 선택하자 (CP949의 기반이 된 문자셋의 이름인데 MS에서는 CP949를 이 이름으로 사용하고 있다는 것 같다).

 

같은 '96B0' 줄에 어떤 글자들이 있는지 확인해보자.

 

CP949에서 '96BB' 에 해당하는 글자는 '뼸' 이다.

 

결론적으로 정리하면, 문자를 기계어로 번역하는 규칙이 한국이랑 일본이랑 다르고, 일본에서 '冥' 에 해당하는 '1001 0110 1011 1011' 이라는 값이 한국에서는 '뼸' 에 해당하기 때문에 이런 현상이 발생한 것이다.

 

사실 '冥' 같은 음악이야 제목이 깨지든 말든 듣기만 하면 되지만, 텍스트를 읽어야 하는 일본산 프로그램 (특히 미연시 장르의 게임 등...) 에서 이런 식으로 문자가 깨지면 제대로 뭘 할 수가 없으므로 인코딩 변환을 해주는 프로그램이 존재했다. 그 유명한 AppLocale ('앱 로캘' 이 맞겠지만 흔히 '어플로케일' 이라 읽었다) 이 바로 그것이다.

 


 

4. 유니코드

 

하지만 사실 위에서 설명했던 건 좀 된 얘기고, 요즘에는 이런 현상을 흔히 볼 수 없는데, 세계화 시대에 이런 꼴을 넋놓고 볼 수는 없었던 이들이 유니코드 (Unicode) 라는 전세계 통합 문자 체계를 만들었기 때문이다. 전세계 통합이라는 말 그대로 유니코드에는 세계 각 나라에서 현재 통용되는 거의 모든 문자들이 다 들어가 있다. 즉 유니코드를 쓰면 위에서 설명했던 문자 깨짐 현상이 일어날 일이 없기 때문에 현재는 유니코드가 전세계에서 표준으로 사용되고 있다.

 

'유니코드' 자체는 문자셋이고, 이를 인코딩하는 방법으로 UTF-8, UTF-16 등이 있다. 이 중 가장 널리 쓰이는 UTF-8이라는 이름은 뭔지 자세히는 몰라도 많이들 들어봤을 것이다. UTF는 Unicode-Transformation-Format의 약자이고 뒤에 붙는 숫자는 기본으로 쓰는 비트수를 의미한다.

 

그렇다고 UTF-8이 무조건 8비트 = 1바이트만 쓰는건 아니다. 아스키 코드에서 봤듯 1바이트로 전세계의 모든 문자를 표현할 수는 없기 때문이다. 아스키 코드랑 호환되도록 아스키 코드 범위 내의 문자까지는 1바이트로 표현하고, 그 이외의 문자들을 표현할 때는 2바이트, 3바이트... 를 가변적으로 사용한다 (가변 길이 문자 인코딩 방식이라 한다).

 

UTF-8이랑 UTF-16, 그리고 그 외에도 몇 가지 인코딩 방식이 더 있는데 기본으로 쓰는 비트 수 이외에도 표현 규칙에 있어 몇 가지 차이가 있다. 이 글에서 설명하기엔 쓸데없이 복잡하므로 그리고 나도 잘 모른다 궁금한 사람은 여기를 참조하자.

 

 

그림은 유니코드 문자표를 축소시켜놓은 것인데, 주황색이 한자고 빨간색 중에 상당수가 한글이다. 한자랑 한글이 유니코드 공간의 상당수를 잡아먹고 있는 것을 알 수 있다...

 

그러나 유니코드가 국제 표준이라곤 하지만 모두가 표준을 철저하게 지키는 것은 아니다. 옛날에 만들어진 사이트/프로그램들이거나 철저하게 내수용으로 기획된 프로그램이거나 (사실 미연시 같은건 이쪽에 해당할지도) 프로그래머가 표준에 관심이 없거나 (...) 등의 이유로 아직 CP949나 Shift-JIS같은 국가별 인코딩을 사용하기도 한다. 유니코드는 1990년대에 생겼지만 문자 깨짐 이슈는 2000년대 인터넷 세대에게도 익숙한 현상이라는 점을 기억하자. '뼸' 도 2005년에 나온 곡이고.

 

그래도 점차 유니코드가 확고하게 자리를 잡아가는 것은 사실이기에 몇년 뒤면 이런 문자 깨짐 현상으로 인한 별명들도 과거의 유산으로 남을 것 같다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함