본문 바로가기

쓰기

저번에 (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/43d/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
164 Talk ATCode에 @가 붙은 글꼴을 빼버려야겠군요 Hide_D 2010-12-11 16792
163 Talk KiriKiri 텍스트 파싱 개선 프로젝트! Hide_D 2010-10-28 22403
162 Talk [뻘글] 요새 프로텍터가 하도 무서워서 Hide_D 2010-10-26 22878
161 Talk JSCustom의 초기 골격 코드를 SVN에 커밋했습니다. [1] Hide_D 2010-09-18 33949
160 Talk ATCustom - 프로젝트 소개 [8] Hide_D 2010-07-22 32701
159 Talk ATCustom - 함수 Reference [47] Hide_D 2010-07-20 103937
158 Talk AT 0.2에서 내부 버퍼가 4096을 넘을 수 있어야 합니다. [1] Hide_D 2010-07-13 34245
157 Talk [0.2] OnPluginInit단에서 스레드를 만들 때 [회피법] Hide_D 2010-06-23 27118
156 Talk 번역 모듈로 인터넷을 이용하는 방법. Hide_D 2010-06-04 30170
155 Talk 6월 1일 2시 챗던 Talk Hide_D 2010-06-01 18098
154 Talk 0.3님 제발 자비좀[.....] file 아무개 2010-05-23 31299
153 Talk ATS의 문제점.. Hide_D 2010-05-15 23578
152 Talk 0.3님 제발 자비좀[.....] [2] G2m 2010-05-05 29951
151 Talk FixLine 버그 발생 [1] Hide_D 2010-04-25 23382
150 Talk 아랄3 디버깅이 말이죠... [2] file JKLeetro 2010-04-20 35689
149 Talk Hide_D's Todo List [1] Hide_D 2010-03-01 19791
148 Talk '잡담인데' [2] FrigateBird 2010-02-22 23212
147 Talk 어떤 정신나간 게임은 UTF-32를 쓰네요 -_-;; [1] Hide_D 2010-01-30 19284
146 Talk 뭐라고 설명해야할까요 -_-; 하여간 설명 file G2m 2010-01-21 22598
145 Talk 문자열 길이에 대한 건의 file G2m 2010-01-21 15608