본문 바로가기

쓰기

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

이 문제는 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/2e9/trackback
게시글 주소 :
https://arallab.hided.net/board_devtalk/3532
List of Articles
번호 제목 글쓴이 조회 수sort 추천 수 날짜 최근 수정일
공지 Talk [필독] 테스트필터 사용시 주의사항 라파에 155439   2008-08-03 2008-12-16 00:03
184 Talk XP에서 번역시 단순에 의한 띄어쓰기 처리... [3] EroGame 1798   2012-05-28 2012-05-30 09:05
xp 에서 간혹 이지트랜스의 단순 딕을 사용시 나오는 하나의 버그가 있습니다. 예를 들면 @np20003이것은 대사입니다.%K 라는 대사가 있다고 가정할때 윈7에서는 필터 없이 그냥 번역을 거처도 앞뒤에 있는 1바이트 명령어에 아무런 변질도 되지 않고 나오게 ...  
183 Talk 픽스라인 추가기능 건의. EroGame 1799   2012-04-29 2012-04-29 15:18
현재 픽스라인에 버그도 버그가 많지만.. 일단 부가적으로 추가할 기능 몇개 끄적여 놓고 갑니다. (까먹을까봐) 1.패턴 중 인자값에서 번역 인자로 지정할때(임의의 길이 설정시) 공백 제거 기능 추가 말 그대로 임의 길이로 지정하여 번역함으로 해놓고 그 부...  
182 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, 종결문자는 특정 헥스값을 입력하여 서치...  
181 Talk 어김없이 기능추가 건의입니다. [3] EroGame 1865   2012-04-22 2012-05-05 09:15
그 뭐냐. 스마트 기능이 어째 제대로 빛을 발휘하지 못하고 있습니다. 왜그런가 되돌아서 생각해보니 발더스카이 개조할때 구현한 기능중 하나가 스마트에서 빠졌다는겁니다;; 그래서 요번 기가 사에서 나온 게임들 전부가 에러 팅팅 거리면서 꺼지더군요. OTL...  
180 Talk 스마트와 조금 다른 엔진의 처리...(알고보니 유리스엔진) [3] EroGame 1906   2012-05-30 2012-06-09 23:37
예전에 그 아랄과 최악의 상성으로 불리던 처리 방식이 KLEIN 사의 青空と雲と彼女の恋 여기서도 사용되네요. 그냥 포기할까 하다가... 스마트 방식과는 별개로 처리 방식을 하나 만들어야 될것 같습니다. (아래와 같은 처리를 한걸 여럿 보아왔기 때문에.. 스...  
179 Talk ATCode 새로운 기능 추가. [5] EroGame 2518   2012-04-01 2012-04-03 19:19
제가 시간만 된다면 약간의 데모스럽게 소스라도 올려드리는데.. 좀 여의치 않군요. 일단 생각한 방안입니다. 예전부터 필요한 기능이라 생각했는데 이래저래 고민 끝에 해결방안이 나왔습니다. 현재 ATCode의 후킹 방식은 한 함수 내에 후킹 지점부터 리턴 포...  
178 Talk 아랄트랜스 0.2 구글코드 svn 밴당했나요? whoami 2536   2014-02-15 2014-02-15 22:54
오랫만입니다... ^^ 새해 복 많이 받으세요.. 이미 늦었나. 아래 Wales 님이 코드수정을 몇 개 하신 것을 보고 오랫만에 svn 업데이트를 하려고 하니 에러가 뜨더군요. 그래서 구글코드 들어가 보니 프로젝트가 사라졌네요? 동일한 이름의 프로젝트를 만들려고...  
177 Talk 아랄트랜스 0.2 소스 bitbucket 으로 올려놨습니다. [7] whoami 2832   2014-02-18 2018-12-27 18:27
구글코드 SVN 에 무슨 일이 생겼는지 몰라서 일단 백업삼아 bitbucket 에 repositiry 하나 잡고 소스를 올렸습니다. 아무래도 옛날 SVN과 인터페이스가 비슷해서 (TortoiseHg) 편한 Mercurial 로 세팅했고.. 공개로 일단 해놓기는 했는데.. 어차피 개발진이 몇...  
176 Talk 이지트랜스 플러그인 Ehnd 제작자입니다. [6] kiereh 3433   2014-02-27 2014-03-01 17:59
에그헤드의 필터 기능을 타 써드파티 프로그램에서도 사용할 수 있게 하자는 발상으로 이지트랜스 플러그인인 Ehnd를 제작하게 되었습니다. 플러그인이라고 하는 이유는 Proxy DLL 기법을 이용해 구현하였고 (Ehnd의 DLL 이름은 J2KEngine.dll, 기존 이지트랜...  
175 Talk SMSTR 의 부가옵션에 대한 토론.. [4] whoami 3800   2012-02-14 2012-07-12 19:27
ATCode 테스트버전 120207 의 댓글이 너무 복잡하게 꼬여서 이쪽으로 뺍니다. 현재 120207 에서 SMSTR 은 기본적으로 피시님 버전의 OVERWRITE(IGNORE,BUFCHANGE) 모드로만 돌아가도록 만들어져 있습니다. 그런데 피시님께서 부가기능이 필요하시다고 하셨는데...  
174 Talk AralTrans 20120214 버전 변경점 [6] whoami 4193   2012-02-14 2012-06-17 14:29
아랄트랜스 20120214 버전에서의 변경점 1. ATCTNR.dll 버그 수정 - 모듈 정보에서 이미지 파일 크기가 부정확할 경우 Access Violation 에러가 나는 문제 해결. Rewrite (Key) 에서 작동 확인. 다른 게임은 미확인이나 피시님의 ATCTNR 패치가 거의 동일하기 ...  
173 Talk FrigateBird님의 ATCode 20111003버전에 대하여.. [9] whoami 4957   2011-11-02 2011-12-10 16:16
일단 FrigateBird(잘 알려진 피시로 호칭)님의 ATCode 20111003 (줄여서 1003버전) 을 한번 훑어보았는데요, 1003 버전의 주된 변경점은 Siglus 엔진에 대한 지원이 주를 이루고 있습니다. 물론 기존 ATCode 의 버그를 잡은 것도 있지만 마이너하니 넘어갑니다...  
172 Talk XP3Dumper! [1] Hide_D 5000   2011-12-12 2011-12-24 02:57
기리기리랑 합치면 좀 재밌는게 나올 것 같아서 뜯어보고 있습니다. 결과물은 아마 내년(ㅋㅋㅋ)에 나올것 같네요  
171 Talk AralTrans, ATCTNR 111112 버전 SVN에 추가. [1] whoami 5260   2011-11-12 2012-06-17 14:29
ATCTNR 의 SVN 소스가 후킹모드 2로 되어있었는데.. 아마 예전에 지나가다정착한이A 님이 발안해서 테스트하던 후킹모드 2 판의 소스가 올라가있었던 듯 합니다. 뭐.. 실제 머리싸매고 고민하다 보니 의외로 돌려놓기가 어렵지 않아서 후킹모드 1로 돌려놓고 ...  
» Talk 퓩퓩... 퓩퓩... oTL whoami 7557   2008-08-02 2009-01-06 01:35
원인을 알아냈습니다. 하지만 이건.. 참 난감하군요. 이 문제는 RLCmd의 문제가 아닙니다. 이 문제는 SOW방식의 문제도 아닙니다. 이 문제는 한글 완성형 코드의 문제입니다... oTL 예전에 KoFilter 를 한참 만들고 있을 때... 이 이야기가 나온 적이 있었습니...  
169 Talk 문자열 -> Hex 변환이 제대로 안되네요. [7] Hide_D 7561   2008-08-02 2009-01-06 01:00
LPSTR ConvertHex(LPCSTR source){ size_t Len=strlen(source); char Temp[2048]=""; BYTE szBuf[3] = { '', }; int j=0; for(size_t i=0;i<Len;i++){ szBuf[0]=(BYTE) source[i]; szBuf[1]=(BYTE) source[i+1]; if(szBuf[0]<0x80){ //1바이트 코드라면 j += ...  
168 Talk Hide_D군님, CCustomDic2 의 문제점을 알 것 같습니다.. [1] whoami 7811   2008-08-12 2008-08-12 22:41
저번에 (5) 문제.. 기억하시나요? 아마도 이것 때문인 것 같습니다. void CCustomDic2::PreCustomDic(LPSTR Dest, LPCSTR Source) { // ... 전략 for(int head=0;head<SourceLen;head++) { for(int tail=SourceLen-1;tail>head;tail--) { // ... 중략 ... //2...  
167 Talk DumpText를 만들고 있는데... [2] Hide_D 7892   2008-08-02 2008-08-02 12:04
밖에서 모달리스 다이얼로그 안으로 데이터를 넣어주는 간단한 방법 없나요 =ㅅ=; 저 방법이 생각안나서 지금 해보려고 하는게, 실시간으로 바깥의 isTextFilled 를 체크해서 true인 경우만 밖의 텍스트를 가져온 다음에 isTextFilled를 false로 만드는 방법밖...  
166 Talk 리얼라이브 세이브에 대해서... [4] 나는누구인감? 7894   2008-08-01 2009-01-06 01:00
오늘 학교에서 하라는 공부는 안하고 곰곰히 생각을 해봤습니다. 세이브 할 경우 현재 위치의 이미지 정보 읽어들임 → 현재 위치의 대사 정보 읽어들임 → 세이브 파일에 저장 로드 할 경우 세이브 파일의 이미지 정보 읽어들임 → 세이브 파일의 대사 정보 읽어...  
165 Talk 0.3에서 추가할것 Hide_D 7908   2008-08-03 2009-01-06 01:00
까먹을까봐 정리 사용자 사전계 1. 사용자사전 유/무 2. 범용사용자사전 유/무 3. 사용자 정의한 주소의 파일 열기(취소) 4. 탭처리 5. 검색 알고리즘 강화(보류) ezTransXP 강화계 1. 번역후 괄호 처리(다이얼로그에 추가)(보류) 2. 사용자 사전과 완벽히 분...