본문 바로가기

쓰기

저번에 (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/662/trackback
게시글 주소 :
https://arallab.hided.net/board_devtalk/3656

Hide_D

2008.08.12
22:41:51
꺄악[.....]
List of Articles
번호 제목 글쓴이 날짜 조회 수sort
공지 Talk [필독] 테스트필터 사용시 주의사항 라파에 2008-08-03 155439
64 Talk 필터 3개 커밋 완료했습니다. [2] Hide_D 2008-08-11 9263
63 Talk RLCmd, KoFilter 의 디버그 로그 기능에 대해.. whoami 2008-07-26 9246
62 Talk ATCode 버전업에 대해 - 관리자님 봐주세요.. [1] whoami 2008-07-26 9241
61 Talk Windows 7, UAC, 64bit Hide_D 2011-04-24 9107
60 Talk whoami님 [3] Hide_D 2008-07-18 9072
59 Talk 비주얼베이직에서의 Hash값 생성 코드 작업 file HaruKaze 2009-01-05 9022
58 Talk http svn을 운용하는건 어떨까요? [3] 아랄 2008-07-20 8950
57 Talk 전에 쓸모 있는 기능의 2번 관련 Hide_D 2008-07-31 8860
56 Talk SOW 방식 지원 ATCode 플러그인 소스 커밋하였습니다.. [2] whoami 2008-07-27 8829
55 Talk 사용자 사전 플러그인에 대해서 설문 [5] Hide_D 2008-07-30 8785
54 Talk 라파에님 한번 테스트해보세요. [2] file Hide_D 2008-08-17 8759
53 Talk 맵을 이렇게 사용해도 되나요? [2] Hide_D 2008-08-09 8705
52 Talk 루비문자 처리 스샷 입니다. file 라파에 2008-08-17 8595
51 Talk 어휴.. [2] file whoami 2008-08-11 8573
50 Talk 아... 괴물한자의 정체가 Hide_D 2008-08-23 8458
49 Talk 플러그인을 다시 Multi2용으로 만들면서 생긴 궁금증 [4] Hide_D 2008-08-09 8374
48 Talk 컨텍스트 구조 제안(핸들러 구조) [4] Hide_D 2011-04-21 8336
47 Talk VS 2005로 갈아탔습니다 [1] Hide_D 2008-08-03 8272
46 Talk 어? ezTransXP 플러그인을 분석하다 생각난건데 [1] Hide_D 2008-07-22 8162
45 Talk 개행 처리 관련해서 일단 제 구상입니다 Hide_D 2008-08-21 8149