본문 바로가기

쓰기

원인을 알아냈습니다. 하지만 이건.. 참 난감하군요.

이 문제는 RLCmd의 문제가 아닙니다.
이 문제는 SOW방식의 문제도 아닙니다.

이 문제는 한글 완성형 코드의 문제입니다... oTL

예전에 KoFilter 를 한참 만들고 있을 때... 이 이야기가 나온 적이 있었습니다.

preKoFilter 테스트 버전 20080712

이건 별거 아니고.. 입력이 KSC-5601 (한글) 인지를 체크해서 한글이면 번역을 거부해버립니다.

테크니컬하게 이야기해서.. 입력중 주요 쓰이는 한글 2350자가 있는지 검사해서 한글이 일어보다 많을 경우 Translate() 실패 (FALSE) 를 돌려줘 버립니다. 
 

여기서 말하는 KSC-5601 이라는 것은, 엄밀하게 말해 KSC-5601-1987 완성형 한글코드 라고 불립니다.
위에 적힌 것처럼 *주요 쓰이는 한글 2350자* 와 일용한자, 각종 특수문자로 구성되어 있지요.

왜 이 이야기가 나오냐면..

"퓩" 이 주요 쓰이는 한글 2350자.. 에 들어있지 않기 때문입니다.. oTL

우리가 보통 윈도우에서 쓰이는 한글은 저 KSC-5601 의 확장판으로, 마이크로소프트 확장 완성형 혹은 CP949라고 불리는 코드입니다.
현대 한글 조합 11172자중 저 2350자만으로는 부족한 8천 몇개의 한자를 다른 부분에 할당한 것이죠.

뭐.. 이에 대해서는 정말 한글 엄마가 보면 미치고 환장할 스토리가 있으니 궁금하시면 저 KSC-5601 이나 확장 완성형 등으로 인터넷을 찾아보시고요, 문제가 생기는 정확한 이유는 다음과 같습니다.

* 단어 설명
리드 바이트 (lead byte) : 어떤 멀티바이트 문자의 첫번째 시작 바이트
트레일 바이트 (trail byte) : 어떤 멀티바이트 문자의 두번째 이후 바이트

* 원인
1. "퓩" 의 코드는 0xBF91 입니다. 이것은 KSC-5601의 2바이트 한글 코드 범위 (리드 0xA1-0xFE, 트레일 0xA1-0xFE) 에 들지 않습니다.
2. 따라서 이 코드는 KSC-5601 을 기준으로 만들어진 ENCODEKOR 로 변환이 안 됩니다.. (문제 1)
3. 그래서 0xBF91 그대로 게임 내 일본어 표시기로 넘어갑니다.
4. 그런데 Shift-JIS 의 코드 범위는 2바이트 코드 (리드 0x81-0x9F, 0xE0-0xEF, 트레일 0x40-0xFC), 1바이트 코드(0xA0-0xDF)이다.
5. 0xBF91 의 리드바이트 0xBF 는 1바이트 코드 (반각 카타카나) 로 취급된다.. (문제 2)
6. 따라서 0xBF 의 한 글자와 0x91~(다음 리드바이트) 로 되어있는 두 개의 글자로 취급된다.
7. 0x91~(다음 리드바이트)에서 문자가 하나 깨지기 시작했으니 그 뒤로 줄줄이 줄줄이 깨진다.. OTL (문제 3)
8. 마지막 # 바로 전 바이트가 리드바이트 취급을 당해 (전 바이트)~# 으로 한 문자 취급 받아 문자열 끝 코드 # 이 깨진다.
9. 리얼라이브 게임 특성상 바로 게임이 멈춰버린다...

* 해결 방법...
가장 좋은 방법은 ENCODEKOR 의 코드를 주물럭대어서 어떻게든 확장완성형의 코드를 이해시키는 방법입니다.
문제는.. ENCODEKOR 의 범위가 KSC-5601의 한글코드 부분이 딱 들어가도록만큼만 되도록 디자인되었다는 것입니다;
계산해 본 결과.. 한글 코드보다 조금 더 들어가게 생기긴 했는데.. 그래도 확장완성형의 코드가 다 들어가기는 너무 좁습니다;

두번째 방법은.. 에찌게에서 많이 쓰이는 몇몇 문자 (퓩 이라거나 츗 이라거나... ㄷㄷㄷ)만을 ENCODEKOR 의 약간 남는 부분에 강제 맵핑하는 방법이 있는데.. 이건 1) 몇몇 문자 라는 게 실제로 어떤것이 있는지 확실하지가 않고 2) 코드 테이블을 따로 만들어야 한다는 단점이 있습니다; 노가다라고 할까요;

마지막으로.. RLCmd 의 빈칸 입력 부분을 고쳐서 2바이트 빈칸 말고 1바이트 빈칸으로 채우는 방법이 있는데.. 이건 실제 게임에서 위의 문제로 인해 글자가 깨지기는 하지만 뒷부분에 1바이트 빈칸이 들어감으로서 줄줄이 깨지는 악순환을 끝내고 # 이 제대로 인식되도록 하는 방법이 있습니다. 하지만, 1) 이 방법은 실제로 문제를 해결하는 것이 아니라 *일단 이 부분만 넘기고 보자!* 라는 근시안적인 방법이고 2) 원문과 번역문의 길이가 같거가 길 경우 1바이트 빈칸이 들어갈 곳이 없다면 역시 게임이 진행 안된다는 문제가 있습니다. 단, 물론 구현은 가장 쉽습니다 orz

어쨌든.. 이 문제는 정말 골치아프군요; 일단 마지막 방법으로 해당 부분만 넘기도록 RLCmd 를 고쳐보도록 하겠습니다.
분류 :
Talk
조회 수 :
7557
등록일 :
2008.08.02
12:21:48
엮인글 :
https://arallab.hided.net/3532/58c/trackback
게시글 주소 :
https://arallab.hided.net/board_devtalk/3532
List of Articles
번호 제목 글쓴이 조회 수sort 추천 수 날짜 최근 수정일
공지 Talk [필독] 테스트필터 사용시 주의사항 라파에 155440   2008-08-03 2008-12-16 00:03
369 Talk 아랄트랜스 번역플러그인에 이 프로그램들을 추가해주시면 안될까요? [5] 암흑마제 1536   2013-03-14 2013-03-14 22:16
1.TransCAT KJ/JK - 한일,일한 양방향 실시간 번역 프로그램 창신소프트의 이지트랜스와 마찬가지로 한일,일한 번역 프로그램입니다. 이지트랜스와 마찬가지로 사용자사전 기능을 제공하여 사용자사전을 잘만 이용하면 번역은 더 좋아집니다. 공통적인 성격을...  
368 Archive [소스, 플러그인] ATCode 120618 [2] file EroGame 1634   2012-06-14 2012-06-18 00:48
 
367 Archive [플러그인] ATCode 120730 [10] file EroGame 1677   2012-07-30 2012-08-03 08:14
 
366 Archive [실행파일, 플러그인] AralTrans, ATCTNR 121104 [14] file EroGame 1680   2012-11-04 2012-11-05 13:13
 
365 Archive [소스, 플러그인] ATCode 120725 [22] file EroGame 1702   2012-07-25 2012-07-30 08:14
 
364 Archive [실행파일, 플러그인] AralTrans, ATCTNR, ATCode 121106 [10] file EroGame 1720   2012-11-06 2012-11-07 22:20
 
363 Archive [소스, 플러그인] ATCode 120613 [1] file EroGame 1740   2012-06-13 2012-07-12 19:27
 
362 Talk LEN 기능에서 체크기능 제거 및 투가기능. EroGame 1766   2012-05-10 2012-05-10 10:37
현재 LEN 기능으로 길이 연산 체크를 할때 -1이나 0의 범위까지 0x00인 NULL 문자로 길이 체크를 하잖아요? 그렇지 않은 경우도 있네요. 길이는 있으나 해당 번역문+길이 위치에 NULL문자가 없는 형태의 길이 교체형태도 추가주세요. (그때는 길이값만 변하도...  
361 Talk ATCode에 추가했던 ASLR 있잖아요. [2] EroGame 1767   2012-06-18 2012-08-03 08:38
http://lab.aralgood.com/index.php?document_srl=49989 이때 추가한건데 이거 따로 분리해서 사용 유무 지정하는게 좋을것 같네요. (xp에서는 무반응으로 처리하고) 특정 게임에서 연산중 뻗는 경우 발견되었습니다. 더미다 같은경우는 굳이 연산안들어가고 ...  
360 Talk XP에서 번역시 단순에 의한 띄어쓰기 처리... [3] EroGame 1798   2012-05-28 2012-05-30 09:05
xp 에서 간혹 이지트랜스의 단순 딕을 사용시 나오는 하나의 버그가 있습니다. 예를 들면 @np20003이것은 대사입니다.%K 라는 대사가 있다고 가정할때 윈7에서는 필터 없이 그냥 번역을 거처도 앞뒤에 있는 1바이트 명령어에 아무런 변질도 되지 않고 나오게 ...  
359 Talk 픽스라인 추가기능 건의. EroGame 1799   2012-04-29 2012-04-29 15:18
현재 픽스라인에 버그도 버그가 많지만.. 일단 부가적으로 추가할 기능 몇개 끄적여 놓고 갑니다. (까먹을까봐) 1.패턴 중 인자값에서 번역 인자로 지정할때(임의의 길이 설정시) 공백 제거 기능 추가 말 그대로 임의 길이로 지정하여 번역함으로 해놓고 그 부...  
358 Talk 추후 업데이트(언젠가, 누군가) 해야 할 사항입니다. (7/28) [5] TwoComet 1858   2013-01-22 2013-09-21 03:00
1. SCP 기능 추가(ATCode에 병합) - 파기(현재 잠정적인 해결) 2. 기리기리 W2M, M2W 변환체크 추가(NTLEA를 이용한 대사수집) - 일시보류 3. 종결문자 따로 강제지정 (0x00을 \0으로 변환하고 표기불가능 문자는 %xx, 종결문자는 특정 헥스값을 입력하여 서치...  
357 Talk 어김없이 기능추가 건의입니다. [3] EroGame 1865   2012-04-22 2012-05-05 09:15
그 뭐냐. 스마트 기능이 어째 제대로 빛을 발휘하지 못하고 있습니다. 왜그런가 되돌아서 생각해보니 발더스카이 개조할때 구현한 기능중 하나가 스마트에서 빠졌다는겁니다;; 그래서 요번 기가 사에서 나온 게임들 전부가 에러 팅팅 거리면서 꺼지더군요. OTL...  
356 Archive [플러그인] ATCode 130707 (파기) [44] TwoComet 1900   2013-07-07 2013-07-28 20:06
리얼라이브 엔진 전용기능인 SOW를 복구코드 사용시에 미지원했던 기능인 '원본 백업 및 복구' 를 살려 번역했던 메모리를 원문으로 복구하도록 했습니다만 아직 테스트를 못했습니다. 테스트 해주시고 문제 없을시 반영하도록 하겠습니다. ATCode.zip 나츠유...  
355 Talk 스마트와 조금 다른 엔진의 처리...(알고보니 유리스엔진) [3] EroGame 1907   2012-05-30 2012-06-09 23:37
예전에 그 아랄과 최악의 상성으로 불리던 처리 방식이 KLEIN 사의 青空と雲と彼女の恋 여기서도 사용되네요. 그냥 포기할까 하다가... 스마트 방식과는 별개로 처리 방식을 하나 만들어야 될것 같습니다. (아래와 같은 처리를 한걸 여럿 보아왔기 때문에.. 스...  
354 Archive 대략 0.2 아랄 업뎃... [5] file EroGame 1918   2012-07-26 2012-07-26 18:37
 
353 Archive [소스, 플러그인] ATCode 120521 [9] file EroGame 2065   2012-05-21 2012-06-10 13:17
 
352 Archive [소스, 플러그인] ATCode 120610 테스트 버전 [5] file EroGame 2067   2012-06-10 2012-06-11 00:17
 
351 Archive ATCTNR (AralTrans) 120407 [1] file whoami 2085   2012-04-07 2012-04-07 23:10
 
350 Talk ATCode 새로운 기능 추가. [5] EroGame 2518   2012-04-01 2012-04-03 19:19
제가 시간만 된다면 약간의 데모스럽게 소스라도 올려드리는데.. 좀 여의치 않군요. 일단 생각한 방안입니다. 예전부터 필요한 기능이라 생각했는데 이래저래 고민 끝에 해결방안이 나왔습니다. 현재 ATCode의 후킹 방식은 한 함수 내에 후킹 지점부터 리턴 포...