[ 안 내 ]

관리자 허락 없이 해당 포스트의 내용을 외부 사이트에 업로드 하거나 배포하는 행위를 절대적으로 금합니다.
 되도록이면 링크 주소를 이용해주시기 바랍니다. 상세 공지 참조  ▷ 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'라는 코드를 사용한다.
http://ko.wikipedia.org/wiki/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)

유니코드는, 세계 각나라 언어를 하나에 담은 코드이다.  
(http://ko.wikipedia.org/wiki/Unicode 참조)

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

유니코드의 특징중 하나가 바로 '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편에서 계속...

YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. 이전 댓글 더보기
  2. BlogIcon 이즈 군 2011.01.20 09:16 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다. ^^
    한글화.. 역시 쉽지 않은거였어요 ㅜ

  3. BlogIcon 놀다가쿵해쪄 2011.01.20 09:24 신고  댓글주소  수정/삭제  댓글쓰기

    와...오랫만에 보는 코드네요...
    역시 너무 어려워요...ㅋㅋ

  4. BlogIcon 복돌이^^ 2011.01.20 10:09 신고  댓글주소  수정/삭제  댓글쓰기

    오홋...좋은 정보네요~~ ^^
    아주 예전이지만....학교다닐때 전산학개론을 들었던 생각이 얼핏얼핏 나고 있어요..^^

    행복한 하루 되세요~

  5. BlogIcon 메모리얼 2011.01.20 10:24 신고  댓글주소  수정/삭제  댓글쓰기

    이런거 보면 한글화 하는 분들은 정말 신기해요;;

  6. BlogIcon Zorro 2011.01.20 10:54 신고  댓글주소  수정/삭제  댓글쓰기

    아.. 전문적인 글이네요^^;;
    대단하십니다~ㅎㅎ

  7. BlogIcon 티비의 세상구경 2011.01.20 11:29 신고  댓글주소  수정/삭제  댓글쓰기

    갑자기 예전에 PC게임 치트하던 생각이 나네요 ^^;;;
    재미있게 잘 보고 갑니다.

  8. BlogIcon 소노라 2011.01.20 12:09 신고  댓글주소  수정/삭제  댓글쓰기

    개발자도 대단하지만 개인적으로 번역하시는 분들도 그에 못지않게 대단하신 것 같습니다.

  9. 샤노젠 2011.01.20 13:24 신고  댓글주소  수정/삭제  댓글쓰기

    음....일어기준으로 되어있네.
    영어는 1바이트 문자라서 일어번역과 다를까요?

    • BlogIcon 위네모 2011.01.20 19:15 신고  댓글주소  수정/삭제

      영어면 아마 ASCII 코드를 따를겁니다. 영어라고 해서 차이는 별로 없습니다.

      다만 영어코드 그것도 1바이트 코드를 썼다면 사용할수 있는 폰트가
      255자 이하인데 이부분은 조금 고려해보셔야 합니다.
      폰트 확장하면 모를까, 그대로 사용하기에는 무리거든요.

      물론 PC게임이면 상관 없는 이야기입니다.

  10. 마니놓기 2011.01.20 22:08 신고  댓글주소  수정/삭제  댓글쓰기

    =ㅂ= 오.. 국가코드가 이런것이었군요.
    같은 아 자에 이렇게 다양한 모습이라.. 공부되는군요

  11. 지나가는햏자 2011.01.21 16:17 신고  댓글주소  수정/삭제  댓글쓰기

    00은 Null을 뜻하며 문자열의 끝을 나타냅니다.
    0A는 New Line을 뜻하며 문자열의 줄바꿈을 나타냅니다.

    이는 ASCII Code에 정형화된 형태의 코드입니다.
    물론 이 코드 역시 사용자 정의 코드로 표현된 게임이라면 다른 값으로 나오겠지요.

    • BlogIcon 위네모 2011.01.21 20:34 신고  댓글주소  수정/삭제

      ASCII 코드에 정형화 된 코드였군요~
      어쩐지 비슷하다 했더니만 (...)
      저도 좋은 정보 참고합니다. ^^;
      댓글 달아주셔서 감사합니다.

  12. 게이버 2011.01.22 17:10 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 강좌네요 ^^
    요즘 게임들은 유니코드를 많이 사용하지만
    한글 폰트가 들어있는 게임은 적은게 흠이군요
    그래도 PC게임쪽에서는 ttf폰트를 많이 사용해서 다행입니다

    그리고 유니코드에는 UTF-8/UTF-16/UCS2 등의 종류가 있는데 설명되어있는 Big-Endian,Little-Endian의 경우 UCS2에 속하고 UTF8에서 3바이트를 사용합니다~

  13. 징징이 2011.01.22 22:27 신고  댓글주소  수정/삭제  댓글쓰기

    아.. 빨리 미래로 워프했으면 좋겠다.. ㅠㅠ;
    빨리 완강까지 읽고 싶은.. ㅠㅠ;
    ...근데 이 강좌 생각보다 매우 최근에 쓰셨었네요.. 한 1년 전에 쓴게시물인줄알고.. 중도포기 하셨구나 했는데..
    그래서 더욱 다행입니다! +_+
    자.. 빨리빨리 다음 강의를..!

  14. 흰둥이 2011.02.01 23:48 신고  댓글주소  수정/삭제  댓글쓰기

    제가 꼭 알고 싶은 정보들이었는데....정말 감사하네요.
    이해가 안가는 부분들은 직접 실행해 보니까 이해가 쏙쏙 되는게....
    아무튼 평소에는 그냥 프로그램실행하고, 타자치던게...정말 복잡한 과정을 통해서 되는거였군요...
    아무튼 좋은강의 계속 올려주시길 바라겠구요...
    일부분이라도 어서 번역을 해보고 싶네요...
    강의 정말 감사합니다~~^^ 정말 알고싶던 정보들이었거든요 ㅎㅎ

  15. 카르소엔 2011.02.15 23:35 신고  댓글주소  수정/삭제  댓글쓰기

    강좌 정말 잘봤습니다~
    요즘 한글화에 관심이 많아서 강좌를 찾아보고있었는데\
    도움 많이됬습니다 ㅎ
    앞으로도 좋은 강좌 많이 해주셔서 많은분들이
    한글화에 도전해서 좋은게임들을 한글로 즐길수있는 날이 되길바랍니다~

  16. Sidewinder 2011.02.17 14:09 신고  댓글주소  수정/삭제  댓글쓰기

    흥미가 있어서 찾아보고있었는데 잘발견한것같습니다.

    좋은글이네요.

    앞으로도 자주 찾아뵙겠습니다.

  17. 비를즈 2011.11.05 15:12 신고  댓글주소  수정/삭제  댓글쓰기

    제가 shift-jis 일본어 코드를 한글화 하려고 하는데요...
    이 글에서 s-jis의 테이블 txt 파일을 올려주셨잔아여...
    그거를 어떻게 이용해야하는것에요>>???

    제가 많이 찾아보니,, 일단 s-jis의 테이블에 있는 코드에 상응되는 일본어 한글자 한글자를 모두 한글로 다 고쳤어요.. 그다음에 크리스탈타일2 에서 tbl 사용 눌러 테이블을 클릭하고
    그다음에 편집이라고하는데 맞나요??
    그런데,, tbl을 사용한다 클릭하면 화면에는 일본어가 이상한글자로 바뀌네요....
    자세히 알려주세영,.,.,

  18. BlogIcon 라스트윈도우 한밤중의 약속 2014.05.10 16:33 신고  댓글주소  수정/삭제  댓글쓰기

    저기 게임 한글화좀 부탁드리면 안될까요?

    • BlogIcon 위네모 2014.05.11 12:09 신고  댓글주소  수정/삭제

      한글화는 부탁하는게 아니랍니다 ^^
      학생 같으신데, 간단히 비유드리자면
      숙제 못하시겠다고 남에게 부탁하는 거나 다를 바가 없거든요 ^^

  19. BlogIcon dlwlghks8779 2018.01.19 12:49 신고  댓글주소  수정/삭제  댓글쓰기

    혹시 5편이 나왔나요...? 폰트 압축 푸는 법이 정말 궁금한데..
    게시글이 2011년에 나온걸 보면 5편이 나온 것 같은데 게시글 전부 뒤져 봐도 없더군요..ㅠㅠ
    답글 부탁드립니다.

  20. lwlghks8779 2018.01.19 12:57 신고  댓글주소  수정/삭제  댓글쓰기

    에... 저기 dlwlghks8779 댓글이 안 지워지는데 혹시 삭제해 주실 수 있으신가요? 죄송합니다...