본문 바로가기

쓰기

저번에 (5) 문제.. 기억하시나요?

아마도 이것 때문인 것 같습니다.

void CCustomDic2::PreCustomDic(LPSTR Dest, LPCSTR Source)
{
    // ... 전략 
    for(int head=0;head<SourceLen;head++)
    {
          for(int tail=SourceLen-1;tail>head;tail--)
         {
              // ... 중략 ...

             //2바이트 처리, 수행속도 향상용
             if((BYTE)Source[tail]>0x80){
                   tail--;
             }
         }
         //2바이트 처리, 수행속도 향상용
         if((BYTE)Source[head]>0x80){
              //전각문자라면
              head++;
         }
    }
    Temp+=string(Source,SPoint,SourceLen-SPoint); //마무리
}

저기 빨간 부분..
MBCS 에서는 절대 뒤에서 앞으로 탐색하시면 안됩니다. 특히, 일본어인 경우 더 그렇습니다.

일본어 (Shift-JIS) 의 경우, 리드바이트는 81-9F, E0-EE 까지, 트레일바이트는 40-FB 까지인가 그렇습니다.
그런데 이게 거꾸로 탐색하면 트레일 바이트부터 탐색하기 때문에 어디서 어디까지가 글자 1자인지 모르게 됩니다.

예를 들어볼까요.
82 DD  82 60  2E 라는 코드로 만들어진 문자열이 있다고 합시다.

이걸 앞부터 읽으면 다음과 같이 읽힙니다.
[82DD] [8260] [2E]

이걸 뒤부터 읽으면 다음과 같이 읽힙니다.
[??82] [DD82] [60] [2E]

결국.. 글자가 완전히 깨져버리게 됩니다.

만약 8260  이라는 글자를 찾으려 해도.. 당연히 못찾게 되겠지요.

꼭 뒤에서 앞으로 처리를 하고 싶으시다면.. 먼저 MBCS 코드를 글자별로 나눠놓아야 할 필요가 있습니다.
그러니까..
82 DD  82 60  2E 라는 1바이트 코드를 -> [82DD] [8260] [002E] 라는 2바이트 코드로 일단 나눠놓고 ->
뒤에서부터 [8260]이라는 글자를 찾아야 제대로 찾아집니다.

그리고.. ((BYTE)Source[head]>0x80) 이라는 방법을 너무 신뢰하지는 마세요.
Shift-JIS 코드의 리드바이트는  81-9F, E0-EE 라고 했죠? A0-DF 까지는 1바이트 코드 (반각 가타카나) 입니다.
만약 전국란스 같은데에서 반각 카나가 *홀수* 개 쓰이고 다시 전각으로 들어가는 경우.. 앞에서 읽는다 하더라도 저 방법은 역시 글자가 밀려들어가게 됩니다.

분류 :
Talk
조회 수 :
7811
등록일 :
2008.08.12
21:20:32
엮인글 :
https://arallab.hided.net/3656/eef/trackback
게시글 주소 :
https://arallab.hided.net/board_devtalk/3656

Hide_D

2008.08.12
22:41:51
꺄악[.....]
List of Articles
번호 제목 글쓴이 조회 수sort 추천 수 날짜 최근 수정일
공지 Talk [필독] 테스트필터 사용시 주의사항 라파에 155439   2008-08-03 2008-12-16 00:03
329 Archive [플러그인, 소스] FixControlCharactor 20080815(테스트버전) [2] file Hide_D 7533   2008-08-15 2009-01-06 02:06
 
328 Talk 퓩퓩... 퓩퓩... oTL whoami 7557   2008-08-02 2009-01-06 01:35
원인을 알아냈습니다. 하지만 이건.. 참 난감하군요. 이 문제는 RLCmd의 문제가 아닙니다. 이 문제는 SOW방식의 문제도 아닙니다. 이 문제는 한글 완성형 코드의 문제입니다... oTL 예전에 KoFilter 를 한참 만들고 있을 때... 이 이야기가 나온 적이 있었습니...  
327 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 += ...  
326 Archive [플러그인, 소스] CmdFilter 테스트 버전 20080806 [4] file whoami 7719   2008-08-06 2009-01-06 01:00
 
325 Archive [플러그인, 소스] CustomSD 0.3 20080810(테스트버전) [2] file Hide_D 7743   2008-08-10 2008-08-10 14:40
 
324 Archive [플러그인, 소스] RLCmd 20080806 file whoami 7775   2008-08-06 2009-01-06 01:00
 
» 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...  
322 Archive [플러그인,소스] ezTransXP with CustomDic 0.3 20080805(테스트버전) file Hide_D 7830   2008-08-04 2008-08-05 01:06
 
321 Archive [플러그인, 소스] FixControlCharactor 20080817_4(테스트버전) file Hide_D 7877   2008-08-17 2009-01-06 01:01
 
320 Talk DumpText를 만들고 있는데... [2] Hide_D 7892   2008-08-02 2008-08-02 12:04
밖에서 모달리스 다이얼로그 안으로 데이터를 넣어주는 간단한 방법 없나요 =ㅅ=; 저 방법이 생각안나서 지금 해보려고 하는게, 실시간으로 바깥의 isTextFilled 를 체크해서 true인 경우만 밖의 텍스트를 가져온 다음에 isTextFilled를 false로 만드는 방법밖...  
319 Talk 리얼라이브 세이브에 대해서... [4] 나는누구인감? 7894   2008-08-01 2009-01-06 01:00
오늘 학교에서 하라는 공부는 안하고 곰곰히 생각을 해봤습니다. 세이브 할 경우 현재 위치의 이미지 정보 읽어들임 → 현재 위치의 대사 정보 읽어들임 → 세이브 파일에 저장 로드 할 경우 세이브 파일의 이미지 정보 읽어들임 → 세이브 파일의 대사 정보 읽어...  
318 Archive [플러그인] ATCode - OVERWRITE 테스트 버전 20080721 file whoami 7900   2008-07-21 2009-01-06 01:27
 
317 Talk 0.3에서 추가할것 Hide_D 7908   2008-08-03 2009-01-06 01:00
까먹을까봐 정리 사용자 사전계 1. 사용자사전 유/무 2. 범용사용자사전 유/무 3. 사용자 정의한 주소의 파일 열기(취소) 4. 탭처리 5. 검색 알고리즘 강화(보류) ezTransXP 강화계 1. 번역후 괄호 처리(다이얼로그에 추가)(보류) 2. 사용자 사전과 완벽히 분...  
316 Talk whoami님 Util.h의 옵션 파서가 [4] Hide_D 7908   2008-08-10 2008-08-10 15:13
문자열 을 지원하나요? 아니... 으음 c:documents and settindsuser내 문서Game,A루트(미완성).txt 라는 문자열을 파서로 받을 수 있나요?  
315 Talk 플러그인을 만들다가 '또다시' 엄청난 실수를 저질렀다는걸 깨달았습니다. [2] Hide_D 7929   2008-08-12 2009-01-06 01:01
이쪽은 프로그래밍이라보가는 구상과 관련된 문제네요 ㅠ_ㅠ 현재 제가 손대고 있는 플러그인이 사용자사전 사용자대본 개행문자처리 컨트롤문자처리 인데, 두개씩 묶여있는 구조죠. 그런데... 사용자대본 -> 문장단위처리 사용자사전 -> 단어단위처리 개행문...  
314 Archive [플러그인,소스] 사용자사전 0.3 20080813 (RC) file Hide_D 7965   2008-08-13 2008-08-14 23:24
 
313 Talk cmd로 리버ex 테스트 [2] file 앙마vv 8011   2008-07-25 2009-01-06 01:27
 
312 Archive [플러그인, 소스] CustomSD 0.3 20080810_2 [1] file Hide_D 8012   2008-08-10 2009-01-06 01:26
 
311 Archive [플러그인, 소스] DenyWord 테스트 버전 20080809 [1] file whoami 8067   2008-08-09 2009-01-06 01:26
 
310 Archive [플러그인, 소스] DenyWord 테스트 버전 20080811 file whoami 8097   2008-08-11 2009-01-06 01:05