본문 바로가기

쓰기

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

Hide_D

2008.08.12
22:41:51
꺄악[.....]
List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 Talk [필독] 테스트필터 사용시 주의사항 라파에 2008-08-03 155436
64 Talk 으아아앍 SVN [1] Hide_D 2008-09-27 10267
63 Talk 픽스 라인 연기로 인한 임시 대책 Hide_D 2008-09-26 10821
62 Talk 일단, 옵션창 이렇게 생기면 되나요? file Hide_D 2008-09-22 11569
61 Talk 조만간 멀티플러그인은 기본 기능으로 흡수시킬까 합니다. 아랄 2008-09-21 11346
60 Talk 히데님께 문의 해요! [2] file 라파에 2008-09-21 11922
59 Talk 하루카 원문 [1] 나는누구인감? 2008-09-16 10337
58 Talk DenyWord 변경한 내용입니다 Hide_D 2008-09-11 9486
57 Talk [질문]UTF 코드를 SHIFT-JIS와 KS코드로 변환 [4] 호기심맨 2008-09-02 13979
56 Talk 토모요 애프터...... [2] file whoami 2008-08-26 10576
55 Talk FixLine 예상 작동 방식 [1] file Hide_D 2008-08-23 10715
54 Talk 아... 괴물한자의 정체가 Hide_D 2008-08-23 8457
53 Talk 개행 처리 관련해서 일단 제 구상입니다 Hide_D 2008-08-21 8149
52 Talk 루비문자 처리 스샷 입니다. file 라파에 2008-08-17 8595
51 Talk 라파에님 다시 한번 테스트해보세요. [3] file Hide_D 2008-08-17 10896
50 Talk 라파에님 한번 테스트해보세요. [2] file Hide_D 2008-08-17 8759
49 Talk 빈공간[...] file Hide_D 2008-08-16 11531
48 Talk 플러그인을 만들다가 '또다시' 엄청난 실수를 저질렀다는걸 깨달았습니다. [2] Hide_D 2008-08-12 7929
» Talk Hide_D군님, CCustomDic2 의 문제점을 알 것 같습니다.. [1] whoami 2008-08-12 7811
46 Talk 옵션 스트링 버퍼 말이죠? [1] Hide_D 2008-08-11 10830
45 Talk 어휴.. [2] file whoami 2008-08-11 8573