본문 바로가기

쓰기

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

이 문제는 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/2c0/trackback
게시글 주소 :
https://arallab.hided.net/board_devtalk/3532
List of Articles
번호 제목 글쓴이 조회 수sort 추천 수 날짜 최근 수정일
공지 Talk [필독] 테스트필터 사용시 주의사항 라파에 155439   2008-08-03 2008-12-16 00:03
109 Archive FixLine v2 20090402 테스트버전 [1] file Hide_D 14431   2009-04-02 2009-04-02 09:03
 
108 Talk DumpText2 계획안 [6] file Hide_D 14432   2008-10-02 2009-01-06 01:24
 
107 Archive FixLine v2 20090331 테스트버전 [2] file Hide_D 14494   2009-03-31 2009-04-01 14:52
 
106 Talk [오류?] 아랄0.3 실행하여 autofinder 적용시 오류인지... [1] file 암흑마제 14512   2009-12-20 2009-12-20 13:54
 
105 Talk Windows7에서 0.3 현재시점으로 안돌아갑니다.ㅜ [6] Hide_D 14656   2009-12-04 2009-12-09 23:27
이유가 뭘까요  
104 Talk 일단 기리기리 미 번역 파트(선택지) 보고? file Hide_D 14675   2008-07-10 2008-07-10 00:34
 
103 Talk 파일을 다운로드 받을때 한가지 잠재적인 문제점을 발견했습니다. [2] Hide_D 14677   2009-12-18 2009-12-18 18:17
지금 보니까 사이트에 파일을 올려두고 파일을 받아가는 구조로 되어 있는듯 한데, 이 다운로드 고유 주소가 바뀔 수 있다는게 문젭니다. [ex : 업로더가 DenyWord.ini를 수정하기 위해 기존에 올려진 DenyWord.ini를 지우고 새로 올린 경우] 이 때 1. 사용자...  
102 Talk AralTrans 필터 물갈이할 예정입니다.... [1] Hide_D 14725   2009-05-21 2009-05-22 01:55
일단 제가 방학을 시작하기도 했고 하니 아랄트랜스 내에서 제가 제작한 필터를 싹 물갈이해볼 생각입니다. 우선 물갈이 대상 CustomDic 0.4 KDC CustomScript v2 DumpText v2 FixLine v3 작업을 위해서 다음과 같은 라이브러리를 만들어서 걍 복붙 시전할 계...  
101 Archive FixLine v2 20090404 [....] [1] file Hide_D 14767   2009-04-04 2009-04-04 19:10
 
100 Talk 번역 플러그인 난해한 문제???? [3] 호기 14864   2009-03-15 2009-10-20 18:06
지금 ML_Trans라는 번역 플러그인을 만들고 있는데 좀 이해가 안가는 문제가 생기네요.. 아랄에 적용시킨후 다른 번역 플러그인으로 바꿀때는 아무 문제가 안생깁니다 그러니까 번역 플러그인을 EzTransXp<->ML_Trans로 마구 여러번 바꾸어도 문제는 안일어 납...  
99 Archive [플러그인, 소스] CmdFilter 테스트 버전 20080712 [1] file whoami 14942   2008-07-12 2009-01-06 01:00
 
98 Talk [질문] HKCU/Software/AralGood/M2WAddr ? [3] whoami 14960   2008-07-08 2008-07-08 19:14
// CATCodeMgr::Init(ATCodeMgr.cpp) 중에서... // 어플로케일 관련 함수 m_sTextFunc.pfnOrigMultiByteToWideChar = (PROC_MultiByteToWideChar) CRegistryMgr::RegReadDWORD(_T("HKEY_CURRENT_USER\Software\AralGood"), _T("M2WAddr")); m_sTextFunc.pfnOri...  
97 Talk 문자열의 길이를 반영하는 '필터' [4] Hide_D 15027   2010-01-19 2010-01-22 01:28
문자열 길이가 고정되어서 포인터 바꿔치기를 통해서도 길이가 바뀌지 않는 것들이 있는데, 이놈들을 위해 길이를 반영하는 필터가 있으면 좋을것 같습니다. 인자로 반영할 메모리 주소 1. 모듈(메모리 주소) 기반 2. 레지스터 기반 으로 ATCode의 그것과 비슷...  
96 Talk 0.3 SVN 경로 수정했습니다! [2] Hide_D 15071   2009-12-23 2009-12-23 14:03
현재 아랄트랜스가 있는 서버에 SVN이 추가되어서 속도 향상을 목표로 SVN경로를 다음과 같이 변경했습니다. svn://aralgood.com/araltrans03/trunk revision은 몇가지 실수 빼곤 22개 리비젼 그대로 옮겨두었습니다. 다만 커밋 날짜가 달라지게 되므로 경로를...  
95 Talk 줄 바꿈을 n으로 하는 게임에서 벽뚫기 방지 해결책 [1] Hide_D 15082   2008-07-12 2008-07-12 18:09
http://aralgood.com/zbxe/33245 여기 스샷보고 생각난건데, 자릿수를 지정해 주고, n을 새로 먹여주면 벽뚫기가 줄어들지 않을까요.  
94 Talk 번역함수가 불렸을 때 자신이 불린 컨텍스트 이름을 아는 문제.. [8] whoami 15151   2009-12-24 2009-12-26 15:34
4. procTranslate 로 지정된 번역함수가 불렸을 때 자신이 어떤 컨텍스트로 불렸는지 아는 방법 현재 컨텍스트의 이름을 얻는 것 외에는 대부분 원하는게 가능할 것 같습니다. pObjectExtention 에 어떤 객체의 포인터를 넣어 놓고, procTranslate 가 호출되었...  
93 Talk 0.3에서 전국란스의 경우 [1] Hide_D 15179   2009-12-13 2009-12-14 02:10
ats파일을 만들어서 동작할경우 문제가 산넘어 산입니다. 1. 주소 문제 2. Rance7으로 바꾸었을때 AppLocale의 미묘한 작동 ㄹㅋ  
92 Archive [플러그인,소스] FixLine 테스트버전 081215 [5] file Hide_D 15213   2008-12-15 2008-12-16 01:18
 
91 OtherFiles fixline 테스트 [1] file 처음처럼만 15297   2008-12-16 2008-12-16 15:52
 
90 Archive [플러그인,소스] FixLine 테스트버전 081221 [5] file Hide_D 15475   2008-12-21 2008-12-22 02:30