본문 바로가기

쓰기

저번에 (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/356/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
44 Talk DumpText는 아직 개선이 좀 필요한듯; [3] Hide_D 2008-08-03 8111
43 Talk cmd로 리버ex 테스트 [2] file 앙마vv 2008-07-25 8011
42 Talk 플러그인을 만들다가 '또다시' 엄청난 실수를 저질렀다는걸 깨달았습니다. [2] Hide_D 2008-08-12 7929
41 Talk 0.3에서 추가할것 Hide_D 2008-08-03 7908
40 Talk whoami님 Util.h의 옵션 파서가 [4] Hide_D 2008-08-10 7908
39 Talk 리얼라이브 세이브에 대해서... [4] 나는누구인감? 2008-08-01 7894
38 Talk DumpText를 만들고 있는데... [2] Hide_D 2008-08-02 7892
» Talk Hide_D군님, CCustomDic2 의 문제점을 알 것 같습니다.. [1] whoami 2008-08-12 7811
36 Talk 문자열 -> Hex 변환이 제대로 안되네요. [7] Hide_D 2008-08-02 7561
35 Talk 퓩퓩... 퓩퓩... oTL whoami 2008-08-02 7557
34 Talk AralTrans, ATCTNR 111112 버전 SVN에 추가. [1] whoami 2011-11-12 5260
33 Talk XP3Dumper! [1] Hide_D 2011-12-12 5000
32 Talk FrigateBird님의 ATCode 20111003버전에 대하여.. [9] whoami 2011-11-02 4957
31 Talk AralTrans 20120214 버전 변경점 [6] whoami 2012-02-14 4193
30 Talk SMSTR 의 부가옵션에 대한 토론.. [4] whoami 2012-02-14 3800
29 Talk 이지트랜스 플러그인 Ehnd 제작자입니다. [6] kiereh 2014-02-27 3433
28 Talk 아랄트랜스 0.2 소스 bitbucket 으로 올려놨습니다. [7] whoami 2014-02-18 2832
27 Talk 아랄트랜스 0.2 구글코드 svn 밴당했나요? whoami 2014-02-15 2536
26 Talk ATCode 새로운 기능 추가. [5] EroGame 2012-04-01 2518
25 Talk 스마트와 조금 다른 엔진의 처리...(알고보니 유리스엔진) [3] EroGame 2012-05-30 1906