[ 안 내 ]

관리자 허락 없이 해당 포스트의 내용을 외부 사이트에 업로드 하거나 배포하는 행위를 절대적으로 금합니다.
 되도록이면 링크 주소를 이용해주시기 바랍니다. 상세 공지 참조  ▷ http://wiinemo.tistory.com/524
그외의 문의 사항이 있으면 wiinemo.kor@gmail.com 메일 또는 블로그 방명록에 글 남겨주시기 바랍니다.

아마추어 한글화 강좌 #3 - 헥스, 그리고 국가코드의 이해 (+ 고유코드)

다음 과정을 설명하기 앞서, 헥스에 대한 개념과 고유코드에 대한 개념을 짚고 넘어가겠다.


1. 헥스 코드에 대한 이해 - 비트, 헥스, 바이트 (2진수, 16진수)

컴퓨터는 ON / OFF 혹은 YES / NO 에 대한 정보만 이해한다.
그렇기에 우리가 쓰는 글, 게임, 음악, 등의 모든 데이터 들은
2진수 (0, 1만으로 모든 데이터를 표현하는 것) 로 표현이 된다.
컴퓨터는 이 2진수에 대해서 이해하고 처리하지만
정작 사람들은 2진데이터를 보고 이해할 수가 없다.

예로 들어 숫자 1,2,3,4,5 / 6,7,8,9,10는 2진 데이터로 다음과 같이 표현된다.

1, 10, 11, 100, 101 / 110, 111, 1000, 1001, 1010

어떤 구조인지 대충 감은 잡힐 것이다.
하지만 정확히는 알 수 없다.

 'A'라는 글자를 컴퓨터가 이해하는 값은 100001 이다.
컴퓨터는 그렇다치자. 사람이 저걸 알 수 있을까?

대답은 No 이다. 
설령 데이타가 의미하는 값을 알 지언정, 그 코드 그대로 이해할수는 없다.
뿐만아니라 데이터가 커지면 커질수록, 숫자가 길어져 헷갈리게 된다.
사람이 이해하기에 좋은 데이타는 아닌 것이다.

그래서, 사람들은 2진 데이터를 이해하기 위해, 16진수인 헥스를 사용한다.
16진수는 2진수를 베이스로 하고 있다. (2진수 4개가 모인것과 같다)

아까 위의 문제를 보자
16진수로 표현하면 위의 숫자를 다음과 같이 표현할 수 있다.

1, 2, 3, 4, 5  /  6, 7, 8, 9, A

16진수에서 A=10 을 의미한다. 숫자가 16까지 가야 한자리가 넘어가기 때문에 
10~15까지의 숫자는 A,B,C,D,E,F 라는 글자로 각각 대치된다.

결국 1F=15 라는 값을 가지고
1F1을 더한 순간 20 (10진수로 16) 이 된다.

어짜피 처음에는 잘 이해가 가지 않을것이다.
일단은 대충 훑어만 보고 넘어가도록 하자.

이 글을 보고도 잘 이해가 가지 않는다면
윈도우에 있는 '계산기'를 한번 확인해보자.

시작 -> 실행 -> calc를 입력하면 윈도우용 계산기가 뜬다.
여기서 '공학용'  (Win7의 경우 '프로그래머용')을 누르면
계산기가 2진수, 8진수, 10진수, 16진수로 계산할 수 있게 된다.
이것을 이용하여, 몇번 연습해보면 금방 16진수에 대해 이해할 것이다.



* 비트 그리고 헥스, 그리고 바이트에 대한 개념

참고로, 2진 데이터 하나는 '비트' 라고 부른다.  2진 데이터 (비트)가 4개 모이면 헥스이다.

(2진 기준) 0000~1111까지 
(16진 기준) 0~F 까지         
16개의 데이터를 표현할 수 있다.

반면 이런 2진 데이터 비트가 8개 모이면  우리는 이것을 '바이트'라고 한다. (오바이트 아님 -_-;)
같은말로 하면 바이트는, 8개의 비트 혹은 2개의 헥스로 표현할 수 있다.


1 바이트는 = 8개의 비트(2^8) = 2개의 헥스 (16^2) = 256
즉 2개의 헥스의 조합으로 256개의 데이터를 표현한다는 이야기이다.

다시말해, 1바이트는 ->

 (2진수 기준) 0000 0000 ~ 1111 1111까지
(16진수 기준으로) 00 ~ FF 까지              
즉 256개의 데이터를 표현할 수 있다.



위 이미지는, 1바이트를 256개 모두 다른 값을 붙여 놓은 예이다.
(가로 16 x 세로 16 = 256개)
이게 2진 바이너리 파일에 기본에 대한 이해이다. 참고하자.

다시 이야기해두지만, 16진수에 대한 이해를 해야
한글화를 좀 더 이해하기 쉬워진다.


2. 언어 코드에 대한 이해 - EUC-KR (한국어)

헥스에 대해서 대충 이해했다면, 바로 언어코드에 대해 설명하겠다.
우리가 쓰는 모든 언어는 다른 데이터와 마찬가지로 16진수로 표기된다.

언어 코드로 각각의 나라의 언어를 표현하고 있다.
예로들어 우리 한국어는 'EUC-KR'라는 코드를 사용한다.
핸드폰, 컴퓨터, PMP, 등에서 사용하는 이 '한국어'는
'국가적으로 지정된 코드'로 일종의 정해진 규격 코드이다.

예로 들어 지금 메모장에 '가' 라는 글자를 치자


그리고 헥스에디터로 열어보자



보면 '가'의 위치에 B0 A1 이라는 값이 들어가있다. 

즉 EUC-KR이라는 코드에서
가=B0A1 이 되는것이다.

EUC-KR은 한국어를 대표하는 코드로
2바이트 기준 코드로 작성되어있으며
한국어 뿐만 아니라 일본어, 한자가 일부 들어있다.
그래서 한글로 ㄸ + 한자 키를 누르면 일본어를 칠 수 있는거다.



이번에는 메모장에 
'가' 와 'あ' 를 입력해보았다.



이번에는 あ가 AAA2를 가르킨다.
즉 우리는

가=B0A1
あ=AAA2

라는 것을 알 수있다.

우리는 한국에서 있기 때문에 EUC-KR을 사용한다.
하지만, 한국이 아닌 일본과 같은 나라라면...?
EUC-KR이 사용될까?

대답은 역시 No 이다.

국가 언어코드는, 나라마다 다르게 지정되어있다. 
(혹은 Window의 언어별로 다르게 지정되어있다)
그러니까 우리가 지금 쓰는 EUC-KR은 
일본에가서 따로 설정하지 않는한 바로 쓰지 못하는 것이다.

 일본에서는 Shift-JIS 라는 코드를 사용한다.
이번에는 Shift-JIS라는 코드가 어떻게 쓰이는지 알아보자

3. 국가 언어 코드 - Shift-JIS (SJIS)

일본에서는 규격화된 SJIS코드를 사용한다. 이는 원래 쓰던 JIS코드를 
좀 더 규격화 한것으로... (필자도 잘 모르니 패스...)
어쩄거나 현대에 와서는 우리나라에서 EUC-KR이 쓰이는 것처럼,
일본에서는 S-JIS 코드가 기본 규격으로 쓰인다.

이번에는 S-JIS 코드가 어떤지 알아보겠다.
먼저 한글화 툴인, 크리스탈 툴을 연다.


국가 코드를 '일본어 (Shift-JIS)' 에 맞춘다.
그리고 'ㄸ + 한자'를 눌러 あ를 입력한다.


あ가 입력되었다.
가만보니... 아까 입력한 EUC-KR의 あ와 값이 다르다.

(Shift-JIS) あ=82A0
(EUC-KR) あ=AAA2

분명 같은 글자이지만, 코드가 다르다.
즉 호환이 전혀 되지 않는 것이다.

이것은, 한글화에 있어서 제약이라는 점을 손쉽게 알려주는 결과이다.


가끔 가다보면 한글화를 해보지 않은 사람중에서는 
아래와 한글화를 매우 간단히 생각하는 경우가 있는데...

'한글화? 그거 그냥 스크립트가 적혀있는거 찾아다가 
한글로 번역하면 되는거 아니야?

물론 당연히 아니다. 
이런 문제를 감안하고 해야하는 게 한글화다.
그러니까 한글화가 개노가다라는거다.

코드를 본것만으로도 간단히 이해했겠지만, Shift-JIS 코드를 베이스로 하는 게임에다가
EUC-KR을 베이스로 하는 코드를 죽어라고 입력해봐야, 제대로 출력될리가 없다.
(물론 출력되기 이전에, 해당 게임에 '한글 폰트'가 없을 가능성이 더 높겠지만 말이다)

(다만, PC용 일본어 게임의 경우만 예외로 Window 폰트가 한글을 지원하기 때문에
어셈블리를 통해서, 실행파일에서 사용하는 국가코드를 'Shift-JIS'에서 
'EUC-KR'로 바꿔주면 위에 말대로 '스크립트' 번역만하여 입력하면 끝나게 된다..)

어쨌거나, Shift-JIS는 일본에서 쓰는 코드이다. 
한글화를 하려면 Shift-JIS (SJIS) 코드에 대해 알아두어야 한다.

참고로 SJIS는 코드표가 있다. 아래 참고 


위 파일을 받아 열어보면, SJIS코드에 대응하는 모든 코드가 나와있다.

한글화하는데 아마 거의 필수 아이템일 것이다. 미리 챙겨두자.
아무튼, 여기까지가 SJIS에 대한 설명이다.

그런데 이쯤되면 이 국가코드에 대해 다음과 같이 의문을 품는 독자가 있을것이다.

'요새는 글로벌 이웃이라고 해서, 세계가 공통적으로 쓰는데 
국가별로 이런 코드가 따로 쓰인단 말이야?'

물론 이런 해결책으로 나온 것이 있다. 바로 유니코드이다. 

4. 국가 코드 - 유니코드 (Unicode), 유니코드 빅 엔디언 (Unicode Big-Endian)

유니코드는, 세계 각나라 언어를 하나에 담은 코드이다.  

유니코드는, 각 국가의 코드를 하나로 통합하는게 목적으로
하나의 규격화된 코드로 전세계 언어를 표현하는데에 목적이 있다.

유니코드의 특징중 하나가 바로 '3바이트'를 사용한다는 점인데
이는, 다른 국가코드가 2바이트를 코드를 사용하는데에 비해
전세계에서 사용하는 언어의 갯수가 워낙 많아.
2바이트로 (0000-FFFF까지 65536개) 표현할 수 있는 
글자 수를 넘기때문에 3바이트를 사용하는 것으로 알려져있다.

* 다만, 3바이트 코드라고 해서 모든 코드가 3바이트로 쓰이지는 않는다.
처음 0000~FFFF까지의 2바이트 데이터 안에 표현 할 수 있기 때문이다.
그래서 일부 데이터들 (한국어, 일본어, 한자 일부)는 간혹 2바이트 그대로 쓰이고 있다.

유니코드 Big-Endian은, 유니코드의 배열방식이 뒤집힌걸 말한다.
예로들어, FF00 -> 00FF로 표현하는 것처럼 말한다.

어쩄거나, 아까 봤던 'あ'를 유니코드 / 유니코드 빅 엔디언으로 입력해보자


유니코드 (Unicode)



유니코드 빅 엔디안 (Unicode Big-Endian)


이제 이 글을 보는 독자들도 국가코드에 대한 감이 잡혀갈 것이다.
이제 여태까지 본 것 코드 값을 간단히 정리해본다.

(Shift-JIS) あ=82A0
(EUC-KR) あ=AAA2
(Unicode) あ=4230
(Big-Endian) あ=3042



5. 사용자 정의 코드 - 고유 코드 (User Custom Code) / 제어코드

마지막으로 고유코드를 소개하겠다. 

최근에 와서는 많은 게임들이 위와 같은 유니코드 혹은 SJIS와 같은 정형화된 코드를 사용한다.
하지만 개중에는 이런 정형화된 코드를 사용하지 않는 경우도 있다. 이런 게임들은, 
개발진이 직접 개발해낸 고유한 순서대로 폰트가 정렬되어 있으며, 게임 내에서 이 규칙을 따른다.

이 코드의 방식을 '고유 코드 (사용자 정의 코드)' 라고 한다.

현재에는 잘 쓰지 않지만, 아주 간혹 쓰는 게임들도 있고
슈퍼패미콤 이전 시절의 게임들의 경우 SJIS가 정형화
 되지 않던 시기었기 때문에 고유코드를 많이 사용했다.

고유 코드는, 말 그대로 사용자 정의 코드이기 때문에
어떤 규칙인지는, 정말 게임마다 다르다.
다만 하나 확실한 사실은 
거의 모든 고유코드가 01 혹은 00 01 부터 시작한다는 것이다.

예로 들어 아래와 같은 폰트가 있다고 하자.


순서는 아이우에오가나다라마 (あいうえお家羅多羅馬)이다.

만약 이 폰트가 제어코드라고 한다면, 이 코드의 순서는 다음과 같다.

あ=01
い=02
う=03
え=04
お=05
家=06
羅=07
多=08
羅=09
馬=0A

만약 아니오(いいえ)를 고유코드로
표현하면 02 02 04 가 된다.

이제 코드에 대한 이해가 거의 끝나갈 것이다.



이제 정말, 마지막으로 '제어코드'에 대해 소개한다.

제어코드라는 건, 스크립트 내에 대사가 아닌  전혀 다른 목적으로 들어있는 사용자 정의 코드이다.
개발진에서 게임을 개발할때 넣은 코드로 사용에는 여러가지 목적이 있지만, 대표적으로

1. 대사를 한줄 넘기거나                                
2. 대사창을 넘기거나                                    
3. 대사내에 특정 문장의 색상을 바꾸거나          
4. 대사의 크기를 조정하거나                          
5. 대사 뒤에 상황 (음악, 아이템)등을 조정하거나

결국 게임에서 사용하는 코드가 SJIS이던 고유코드이던 간에
제어코드는 모두 고유코드가 되는 셈이다.

물론 제어코드들은 거의 게임마다 다 다른편이라
이에대해서 정확한 설명은 여기에 할 수 없다.
다만, 하나 확실한건, 자주 사용하는 코드가 있다는 점이다.
바로 00, 0A 같은 코드이다.

필자의 경험상, 많은 게임의 대사가 끝나는 뒷부분에 00이 붙어있었다.
00으로 대사가 끝나는 것을 알리는 것이다. 그리고 0A의 경우는 한줄을 넘기는 것이다.
물론 0A가 아닌 게임들도 많지만, 0A를 쓰는 게임들도 더러 있다.

마지막으로, 제어코드와 EUC-KR과 제어코드를 통해 한번 확인해보도록 하자

예로들어

 나는 졸립습니다.
자고싶어요.

를 EUC-KR과 제어코드 (00/0A) 표기하면



다음과 같은 코드가 된다.


이제 마무리하며, 언넝 끝내도록 하자.
 (아구 지겹다...)

(Shift-JIS) あ=82A0
(EUC-KR) あ=AAA2
(Unicode) あ=4230
(Big-Endian) あ=3042
(고유코드) あ=01
       (제어코드) ▼=0A (한줄넘김)


모든 독자들도 읽느라 수고했다. (--)(__)
4편에서 계속...