2.ÆÄÀÏ Æ÷¸Ë

°¡.À¯´ÏÄÚµå Áö¿ø

ÅؽºÆ® ÆÄÀÏÀº ¹®ÀÚ¹Û¿¡ ¾ø´Â ¾ÆÁÖ ´Ü¼øÇÑ Æ÷¸ËÀÎ °Í °°Áö¸¸ À̰͵µ ÀÎÄÚµù ¹æ½Ä¿¡ µû¶ó ¾ÆÁÖ ¸¹Àº Á¾·ù°¡ ÀÖ¾î ÀÌÁø ÆÄÀϺ¸´Ù ¿ÀÈ÷·Á °ü¸®Çϱ⠴õ ±î´Ù·Î¿î ÆíÀÌ´Ù. ApiEditÀÇ ÆÄÀÏ Æ÷¸Ë ºÐ¼® ·çƾ¿¡ ¸î °¡Áö ÇãÁ¡ÀÌ ÀÖ¾î ƯÁ¤ ÆÄÀÏ¿¡¼­ ÀÌ»ó µ¿ÀÛÀ» ÇÏ´Â °æ¿ì°¡ Á¾Á¾ ÀÖ´Ù. ÀÌÁø ÆÄÀÏÀ» ¿­¾ú´Âµ¥ IsTextUnicode ÇÔ¼ö°¡ À¯´ÏÄÚµå ¹®¼­·Î À߸ø ÆľÇÇØ ¾û¶×ÇÑ ÇüÅ·ΠÆÄÀÏÀÌ ¿­¸°´Ù. Áö±Ý±îÁö ¸¸µç ´ç±ÙÀ¸·Î AeUtil.obj ÆÄÀÏÀ» ¿­¾î º¸¸é Åεµ ¾øÀÌ ÂªÀº ±æÀÌ·Î Ãâ·ÂµÈ´Ù.

ÀÌ ÆÄÀÏÀÇ ¾ÕÂÊ ¿ÀÇÁ¼Â 3À§Ä¡¿¡ 0ÀÌ ÀÖ¾î ÅؽºÆ®·Î °£ÁÖÇÒ ¶§ ±æÀÌ°¡ ºÒ°ú 3 ¹ÙÀÌÆ®¹Û¿¡ ¾ÈµÇ¸ç AnalyzeFormat ÇÔ¼ö´Â ÀÌ ¹®¼­ÀÇ ±æÀ̸¦ lstrlenÀ¸·Î °è»êÇÑ´Ù. IsTextUnicode ÇÔ¼ö´Â ¾ÕÂÊ 3¹ÙÀÌÆ®¸¸ º¸°í À¯´ÏÄÚµå ¹®¼­·Î À߸ø ÆÇ´ÜÇÏ´Â °ÍÀÌ´Ù. ÀÌ ÇÔ¼ö´Â ¾îµð±îÁö³ª È®·üÀûÀ¸·Î ¹®¼­ÀÇ Æ÷¸ËÀ» ÆǺ°Çϱ⠶§¹®¿¡ Ç×»ó Á¤È®ÇÏÁöµµ ¾Ê´Ù. ´ç±ÙÀº ¹®¼­ Æ÷¸Ë ÆǺ° ·çƾ¿¡ ¹®Á¦°¡ ÀÖ´Ù.

¶ÇÇÑ À¯´ÏÄÚµå ¹®¼­µµ ºò ¿£µð¾ÈÀ¸·Î ÀÎÄÚµùµÈ °Í°ú UTF-8 ¹®¼­¸¦ º¯È¯ÇÏÁö ¸øÇÑ´Ù. UTF-8Àº ÃÖ±Ù XML°ú À¥ÀÇ Ç¥ÁØ Æ÷¸ËÀ¸·Î °¢±¤¹Þ°í ÀÖÀ¸¹Ç·Î ±× Áö¿ø ¿©ºÎ°¡ Áß¿äÇØÁ³´Ù. ANSI ¹®¼­µµ °³Çà ÄÚµåÀÇ Çü½Ä¿¡ µû¶ó ¼¼ °¡Áö Á¾·ù°¡ Àִµ¥ ApiEdit´Â ÀÌ Æ÷¸ËµéÀ» Àß ºÐ¼®ÇÏ°í º¯È¯µµ ÀßÇÑ´Ù. ±×·¯³ª °³Çà ÄÚµå Çü½ÄÀÌ ¸¶±¸ ¼¯¿© ÀÖ´Â °æ¿ì´Â »ó´çÈ÷ ¾Ö¸ÅÇѵ¥ ÀÌ °æ¿ì °­Á¦ º¯È¯À» ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ÀÌ·± Á¦¹ÝÀÇ ¹®Á¦µéÀº ±²ÀåÈ÷ Ä¡¸íÀûÀ̹ǷΠ¹Ýµå½Ã ÇØ°áÇØ¾ß ÇÑ´Ù. Áö¿ø Æ÷¸Ë Á¾·ù¸¦ ´Ã¸®±â À§ÇØ ApiEdit.h¿¡ ÀÖ´Â Æ÷¸Ë ¸ÅÅ©·Î »ó¼ö¸¦ Ãß°¡·Î ¼±¾ðÇÑ´Ù.

 

#define AE_FORMAT_WIN 0

#define AE_FORMAT_UNIX 1

#define AE_FORMAT_MAC 2

#define AE_FORMAT_UNICODE 3

#define AE_FORMAT_UNIBIG 4

#define AE_FORMAT_UTF8 5

#define AE_FORMAT_BINARY 6

 

À¯´ÏÄÚµå ºò ¿£µð¾È°ú UTF-8À» ´õ ¼±¾ðÇßÀ¸¸ç ÀÌÁø Æ÷¸ËÀÇ °ªÀº 6À¸·Î ¹Ð·Á³µ´Ù. »óŶõ¿¡´Â ÀÌ Æ÷¸ËµéÀÇ À̸§À» Ãâ·ÂÇÏ´Â Äڵ尡 Àִµ¥ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.

 

void SetStatusText(int mask,LPCTSTR Mes/*=NULL*/)

{

     ....

     if (mask & 4) {

        if (pSi->Ae.GetFormat() != AE_FORMAT_BINARY) {

              ....

     if (mask & 0x10) {

          switch (pSi->Ae.GetFormat()) {

          case AE_FORMAT_WIN:

              lstrcpy(Text,"WIN Æ÷¸Ë");

              break;

          case AE_FORMAT_UNIX:

              lstrcpy(Text,"UNIX Æ÷¸Ë");

              break;

          case AE_FORMAT_MAC:

              lstrcpy(Text,"MAC Æ÷¸Ë");

              break;

          case AE_FORMAT_UNICODE:

              lstrcpy(Text,"UNICODE");

              break;

        case AE_FORMAT_UNIBIG:

           lstrcpy(Text,"UNICODE(Big Endian)");

           break;

        case AE_FORMAT_UTF8:

           lstrcpy(Text,"UTF-8");

           break;

          case AE_FORMAT_BINARY:

              lstrcpy(Text,"ÀÌÁø ÆÄÀÏ");

              break;

          }

          SendMessage(hStatus, SB_SETTEXT, 4, (LPARAM)Text);

     }

 

Ãß°¡µÈ Æ÷¸Ë¿¡ ´ëÇØ »óŶõ¿¡ Àû´çÇÑ ¹®ÀÚ¿­À» Ãâ·ÂÇß´Ù. ¼¼ ¹ø° Ä­¿¡´Â ¹®¼­ÀÇ ±æÀ̸¦ Ãâ·ÂÇϴµ¥ ¿ø·¡´Â À©µµ¿ìÁî Æ÷¸ËÀÏ ¶§ ¹ÙÀÌÆ® ¼ö¸¦ Ç¥½ÃÇßÀ¸³ª ÀÌÁø Æ÷¸ËÀÌ ¾Æ´Ñ ¸ðµç °æ¿ì¿¡ ±æÀ̸¦ Ç¥½ÃÇϵµ·Ï ¼öÁ¤ÇÑ´Ù. WIN Æ÷¸ËÀÌ ¾Æ´Ñ °æ¿ì º¯È¯µÈ ±æÀÌÀ̹ǷΠÁ¤È®ÇÏÁö ¾Ê´Ù´Â ¹®Á¦°¡ ÀÖ±â´Â ÇÏÁö¸¸ »ç¿ëÀÚµéÀÌ º¯È¯µÈ ÅؽºÆ®¶ó´Â °ÍÀ» ¾Ë°í ÀÖÀ¸¹Ç·Î ¹®Á¦°¡ µÉ Á¤µµ´Â ¾Æ´Ï´Ù. ´Ù¼¸ ¹ø° Ä­¿¡´Â ÆÄÀÏ Æ÷¸ËÀ» Ãâ·ÂÇϴµ¥ Ãß°¡µÈ Æ÷¸ËÀÇ À̸§µµ Ç¥½ÃÇß´Ù. ÆÄÀÏ Æ÷¸ËÀ» ÆǺ°ÇÏ´Â AnalyzeForamt ÇÔ¼ö¸¦ ¼öÁ¤ÇÑ´Ù.

 

DWORD CApiEdit::AnalyzeFormat(TCHAR *Text, int dwSize)

{

     TCHAR *p,*p2;

 

     if (dwSize >= 3 && *Text==(TCHAR)0xef && *(Text+1)==(TCHAR)0xbb &&

          *(Text+2)==(TCHAR)0xbf) {

          return AE_FORMAT_UTF8;

     }

 

     if (dwSize >= 2 && *Text==(TCHAR)0xff && *(Text+1)==(TCHAR)0xfe) {

          return AE_FORMAT_UNICODE;

     }

    

     if (dwSize >= 2 && *Text==(TCHAR)0xfe && *(Text+1)==(TCHAR)0xff) {

          return AE_FORMAT_UNIBIG;

     }

 

     if (dwSize != -1) {

          for (p=Text;p-Text < dwSize;p++) {

              if (*p==0) {

                   return AE_FORMAT_BINARY;

              }

          }

     }

 

     p=strchr(Text,'\r');

     ....

 

À¯´ÏÄÚµå ¹®¼­´Â ¼±µÎ¿¡ ¹ÙÀÌÆ® ¼ø¼­¸¦ Ç¥½ÃÇÏ´Â BOM(Byte Order Mark)ÀÌ ÀÖÀ¸¹Ç·Î ÀÌ °ªÀ» Àоî ÆǺ°Çß´Ù. BOMÀÌ ¾ø´Â ¹®¼­µµ °¡²û Á¸ÀçÇϴµ¥ ÀÌ·± °æ¿ì´Â È®·üÀûÀ¸·Î ÆÇ´ÜÇØ¾ß Çϳª Á¤È®ÇÏÁö ¾ÊÀ¸¹Ç·Î ÀÏ´Ü Á¦¿ÜÇß´Ù. À¯´ÏÄڵ尡 ¾Æ´Ï¸é ¹öÆÛ Àüü¸¦ µÚÁ® \0°¡ ¹ß°ßµÇ¸é ÀÌÁø ÆÄÀÏ·Î ÆÇ´ÜÇÑ´Ù. ±×°Íµµ ¾Æ´Ï¸é ¼¼ °¡Áö ÅؽºÆ® Æ÷¸ËÁß ÇϳªÀε¥ °³Çà ÄÚµåÀÇ ÇüÅ·ΠÆÇ´ÜÇÏ´Â ±âÁ¸ Äڵ带 ±×´ë·Î »ç¿ëÇß´Ù.

ÀÌ ÇÔ¼ö¸¦ ¼öÁ¤ÇÑ ÈÄ AeUtil.obj ÆÄÀÏÀ» ÀÐ¾î º¸¸é ÀÌÁø ÆÄÀÏ·Î ÆǺ°ÇϹǷΠÀÌÁ¦ Á¦´ë·Î º¸ÀÏ °ÍÀÌ´Ù. ±×·¯³ª ¾ÆÁ÷ UTF-8À̳ª ºò¿£µð¾ÈÀ¸·Î ÀÎÄÚµùµÈ À¯´ÏÄÚµå ¹®¼­´Â ÀÐÁö ¸øÇÑ´Ù. ÆǺ°Àº Á¦´ë·Î ÇÏÁö¸¸ ApiEditÀÇ ³»ºÎ Æ÷¸ËÀº ¾È½Ã·Î º¯È¯ÇÏ´Â ÄÚµå´Â ÀÛ¼ºµÇ¾î ÀÖÁö ¾Ê±â ¶§¹®ÀÌ´Ù. Æ÷¸ËÀ» º¯È¯ÇÏ´Â ConverFormat ÇÔ¼ö¿¡¼­ »õ·Î¿î Æ÷¸Ëµéµµ ¾È½Ã Æ÷¸ËÀ¸·Î º¯È¯ÇÑ´Ù.

 

int CApiEdit::ConvertFormat(DWORD from, DWORD to, TCHAR *src, int srclen, TCHAR *&dest)

{

     int need,i,num;

     TCHAR *s,*d;

     TCHAR Find;

     LPWSTR t;

 

     switch (from) {

     case AE_FORMAT_UNICODE:

     case AE_FORMAT_UNIBIG:

          // ºò ¿£µð¾ÈÀÌ¸é ¹ÙÀÌÆ® ¼ø¼­¸¦ µÚÁýÀº ÈÄ º¯È¯ÇÑ´Ù.

          if (from == AE_FORMAT_UNIBIG) {

              for (t=(LPWSTR)src,i=0;i<srclen/2;t++,i++) {

                   *t=((*t << 8) | (*t >> 8));

              }

          }

          need=WideCharToMultiByte(CP_ACP,0,(LPCWSTR)src+1,srclen/2-1,NULL,0,0,0);

          dest=(TCHAR *)malloc(need);

          WideCharToMultiByte(CP_ACP,0,(LPCWSTR)src+1,srclen/2-1,dest,need,0,0);

          return need;

     case AE_FORMAT_UTF8:

          // Àӽà ¹öÆÛ¿¡ À¯´ÏÄÚµå·Î ¸ÕÀú º¯È¯ÇÑ´Ù.

          need=MultiByteToWideChar(CP_UTF8,0,src+3,srclen-3,NULL,0);

          t=(LPWSTR)malloc(need*sizeof(wchar_t));

          num=MultiByteToWideChar(CP_UTF8,0,src+3,srclen-3,t,need);

          // À¯´ÏÄڵ带 ¾È½Ã·Î º¯È¯ÇÑ´Ù.

          need=WideCharToMultiByte(CP_ACP,0,(LPCWSTR)t,num,NULL,0,0,0);

          dest=(TCHAR *)malloc(need);

          WideCharToMultiByte(CP_ACP,0,(LPCWSTR)t,num,dest,need,0,0);

          free(t);

          return need;

     }

 

     switch (to) {

     case AE_FORMAT_UNICODE:

     case AE_FORMAT_UNIBIG:

          need=MultiByteToWideChar(CP_ACP,0,src,srclen,NULL,0);

          need++;                                    // ¼±µÎ¿¡ BOM Ãß°¡

          dest=(TCHAR *)malloc(need*sizeof(wchar_t));

          dest[0]=(TCHAR)0xFF;

          dest[1]=(TCHAR)0xFE;

          MultiByteToWideChar(CP_ACP,0,src,srclen,(LPWSTR)dest+1,need);

          if (to == AE_FORMAT_UNIBIG) {

              for (t=(LPWSTR)dest,i=0;i<need;t++,i++) {

                   *t=((*t << 8) | (*t >> 8));

              }

          }

          return need*2;

     case AE_FORMAT_UTF8:

          // ¾È½Ã¸¦ À¯´ÏÄÚµå·Î ¸ÕÀú º¯È¯ÇÑ´Ù.

          need=MultiByteToWideChar(CP_ACP,0,src,srclen,NULL,0);

          t=(LPWSTR)malloc(need*sizeof(wchar_t));

          num=MultiByteToWideChar(CP_ACP,0,src,srclen,t,need);

          // À¯´ÏÄڵ带 UTF-8·Î º¯È¯ÇÑ´Ù.

          need=WideCharToMultiByte(CP_UTF8,0,t,num,NULL,0,0,0);

          need+=3;

          dest=(TCHAR *)malloc(need);

          dest[0]=(TCHAR)0xEF;

          dest[1]=(TCHAR)0xBB;

          dest[2]=(TCHAR)0xBF;

          WideCharToMultiByte(CP_UTF8,0,t,num,dest+3,need,0,0);

          free(t);

          return need;

     }

 

     dest=(TCHAR *)malloc(lstrlen(src)*2);

     ....

 

º¯È¯ÇØ¾ß ÇÒ Æ÷¸ËÀÌ ¸¹¾ÆÁ³À¸¹Ç·Î ±¸Á¶¸¦ ¿ÏÀüÈ÷ ¼öÁ¤Çß´Ù. ºò ¿£µð¾ÈÀº À¯´ÏÄÚµå ¹®¼­¿¡¼­ ¹ÙÀÌÆ® ¼ø¼­¸¸ º¯°æµÈ °ÍÀ̹ǷΠ¸ÕÀú À¯´ÏÄÚµå·Î º¯È¯ÇÑ ÈÄ ¾È½Ã·Î º¯È¯ÇÏ¸é µÈ´Ù. UTF-8Àº ¿î¿µÃ¼Á¦°¡ ¾È½Ã·ÎÀÇ º¯È¯À» Á÷Á¢ Áö¿øÇÏÁö ¾ÊÀ¸¹Ç·Î À¯´ÏÄڵ带 °æÀ¯Çؼ­ º¯È¯ÇØ¾ß ÇÑ´Ù.

UTF-8À» À¯´ÏÄÚµå·Î º¯È¯ÇÒ ¶§´Â MultiByteToWideChar ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. À̶§ Àӽà ¹öÆÛ t¸¦ ÇÒ´çÇؼ­ º¯È¯Çϴµ¥ Á¤È®ÇÑ ¹öÆÛ Å©±â¸¦ ¾Ë±â À§ÇØ ÀÌ ÇÔ¼ö¸¦ µÎ ¹ø È£ÃâÇØ¾ß ÇÑ´Ù. src¿¡ ÀÐÇôÁø ÆÄÀÏ ¼±µÎ¿¡´Â 3¹ÙÀÌÆ®ÀÇ BOMÀÌ ÀÖÀ¸¹Ç·Î BOM ÀÌÈĺÎÅÍ º¯È¯ÇØ¾ß ÇÑ´Ù. t¿¡ º¯È¯µÈ À¯´ÏÄڵ带 ´Ù½Ã ¾È½Ã·Î º¯È¯ÇÑ´Ù. ¾È½Ã¸¦ UTF-8·Î º¯È¯ÇÒ ¶§´Â ¹Ý´ëÀÇ °úÁ¤À» °ÅÄ¡´Âµ¥ À¯´ÏÄÚµå·Î ¸ÕÀú ¹Ù²Û ÈÄ UTF-8·Î º¯È¯ÇÑ´Ù.

ÀÌ º¯È¯Äڵ忡¼­ ¹öÆÛ¿Í º¯È¯ ¹®ÀÚ¿­ÀÇ ±æÀÌ ÁöÁ¤¿¡ »ó´çÈ÷ ÁÖÀÇÇØ¾ß Çϴµ¥ ¾î¶² °æ¿ì´Â ¹ÙÀÌÆ® ¼öÀÌ°í ¾î¶² °æ¿ì´Â ¹®ÀÚ¼ö¿©¼­ ½Ç¼öÇÒ ¿©Áö°¡ ¸¹´Ù. ConvertFormat ÇÔ¼öÀÇ srclenÀº ¹ÙÀÌÆ® ¼öÀ̸ç MultiByteToWideChar ÀμöÀÇ ¸®ÅÏ°ªÀº ¹®ÀÚ¼öÀÌ°í WideCharToMultiByte´Â ¹ÙÀÌÆ®¼ö¸¦ ¸®ÅÏÇÑ´Ù. À¯´ÏÄÚµå´Â 1¹®ÀÚ°¡ 2¹ÙÀÌÆ®¸¦ Â÷ÁöÇϴµ¥ À̸¦ À߸ø °è»êÇÏ¸é ¹öÆÛÀÇ µÚÂÊÀ» À߸ø ¾×¼¼½ºÇÒ À§ÇèÀÌ ÀÖ´Ù.

À¯´Ð½º ¹®¼­¿Í ¸Æ ¹®¼­¸¦ À©µµ¿ìÁî Æ÷¸ËÀ¸·Î º¯È¯ÇÏ´Â ÄÚµå´Â ±×´ë·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â º¯È¯µÈ ÈÄÀÇ ±æÀ̸¦ Á¤È®ÇÏ°Ô ¸®ÅÏÇϹǷΠSetText ÇÔ¼ö¿¡¼­µµ ¸®ÅÏµÈ ±æÀ̸¦ Àû¿ëÇÑ´Ù. ÀÌÀü ¹öÀü¿¡¼­´Â µÚÂÊ¿¡ Ç×»ó NULL¹®ÀÚ¸¦ µÎ¾î lstrlenÀ¸·Î º¯È¯ÈÄÀÇ ±æÀ̸¦ Á¶»çÇßÀ¸³ª ±×·² ÇÊ¿ä°¡ ¾ø´Ù.

 

void CApiEdit::SetText(TCHAR *TextBuf, int dwSize)

{

     TCHAR *dest;

    int len;

 

     InitDoc();

     dwFormat=AnalyzeFormat(TextBuf, dwSize);

     switch (dwFormat) {

     case AE_FORMAT_WIN:

     case AE_FORMAT_BINARY:

          GetActiveView()->Insert(0,TextBuf,dwSize,FALSE);

          break;

     default:

        len=ConvertFormat(dwFormat,AE_FORMAT_WIN,TextBuf,dwSize,dest);

        GetActiveView()->Insert(0,dest,len,FALSE);

          free(dest);

          break;

     }

}

 

º¯È¯ °á°ú ¸®ÅϵǴ ±æÀ̸¦ Á¤È®ÇÏ°Ô »ðÀÔÇÏ¸é µÈ´Ù. ÆÄÀÏÀ» ÀÐÀ» ¶§µµ ¿©ºÐÀÇ ³Î Á¾·á ¹®ÀÚºÐÀ» ÇÒ´çÇÒ ÇÊ¿ä¾øÀÌ ¹®¼­ÀÇ ±æÀ̸¸Å­ Á¤È®ÇÏ°Ô ÇÒ´çÇÏ¸é µÈ´Ù.

 

BOOL OpenFileToChild(HWND hChild, TCHAR *Path)

{

     ....

        TextBuf=(TCHAR *)malloc(dwSize);

          ReadFile(hFile,TextBuf,dwSize,&dwRead,NULL);

        TextBuf[dwRead]=0;

        TextBuf[dwRead+1]=0;

          CloseHandle(hFile);

 

¿©±â±îÁö ÀÛ¾÷ÇÑ ÈÄ Å×½ºÆ®ÇØ º¸¸é À¯´ÏÄÚµå, À¯´ÏÄÚµå ºò¿£µð¾È, UTF-8 ¹®¼­¸¦ Àß Àаí ÆíÁý ÈÄ ÀúÀåÇÏ´Â °Íµµ °¡´ÉÇÒ °ÍÀÌ´Ù. ÀÌ ¹®¼­µéÀº ¸Þ¸ðÀåÀ¸·Î °£´ÜÇÏ°Ô »ý¼ºÇÒ ¼ö ÀÖÀ¸¹Ç·Î ¿©·¯ Æ÷¸ËÀÇ ÆÄÀÏÀ» ¸¸µé¾î¼­ Å×½ºÆ®ÇØ º¸ÀÚ. ÄÁÆ®·ÑÀÇ Áö¿ø Æ÷¸ËÀÌ ´Ã¾î ³µÀ¸¹Ç·Î È£½ºÆ®ÀÇ Áö¿ø Äڵ嵵 ¼öÁ¤ÇÑ´Ù. ¸®¼Ò½º¿¡ ÇÊ¿äÇÑ ¸Þ´º Ç׸ñÀÌ ÀÌ¹Ì ÀÛ¼ºµÇ¾î ÀÖÀ¸¹Ç·Î OnCommand¿¡ Äڵ常 Ãß°¡ÇÏ¸é µÈ´Ù.

 

void OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

     ....

     case IDM_FILE_UNIBIG:

          pSi->Ae.SetFormat(AE_FORMAT_UNIBIG);

          SetStatusText(0x10);

          break;

     case IDM_FILE_UTF_8:

          pSi->Ae.SetFormat(AE_FORMAT_UTF8);

          SetStatusText(0x10);

          break;

 

ºäÀÇ Æ÷¸Ë Á¤º¸¸¸ ¹Ù²ã ³õÀ¸¸é ÀúÀåÇÒ ¶§ Àû¿ëµÈ´Ù. ¸Þ´º Ç׸ñ¿¡µµ ¼±ÅÃµÈ Æ÷¸ËÀ» Ç¥½ÃÇÑ´Ù.

 

void OnInitMenu(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

     ....

          switch (pSi->Ae.GetFormat()) {

          case AE_FORMAT_WIN:

              CheckMenuRadioItem(hMenu,IDM_FILE_WIN,IDM_FILE_UTF_8,IDM_FILE_WIN,MF_BYCOMMAND);

              break;

          case AE_FORMAT_UNIX:

              CheckMenuRadioItem(hMenu,IDM_FILE_WIN,IDM_FILE_UTF_8,IDM_FILE_UNIX,MF_BYCOMMAND);

              break;

          case AE_FORMAT_MAC:

              CheckMenuRadioItem(hMenu,IDM_FILE_WIN,IDM_FILE_UTF_8,IDM_FILE_MAC,MF_BYCOMMAND);

              break;

          case AE_FORMAT_UNICODE:

              CheckMenuRadioItem(hMenu,IDM_FILE_WIN,IDM_FILE_UTF_8,IDM_FILE_UNICODE,MF_BYCOMMAND);

              break;

          case AE_FORMAT_UNIBIG:

              CheckMenuRadioItem(hMenu,IDM_FILE_WIN,IDM_FILE_UTF_8,IDM_FILE_UNIBIG,MF_BYCOMMAND);

              break;

          case AE_FORMAT_UTF8:

              CheckMenuRadioItem(hMenu,IDM_FILE_WIN,IDM_FILE_UTF_8,IDM_FILE_UTF_8,MF_BYCOMMAND);

              break;

          }

 

¸Þ´º Ç׸ñÀÌ µÎ °³ Ãß°¡µÇ¾úÀ¸¹Ç·Î ¶óµð¿À ±×·ìÀÇ ¹üÀ§µµ °°ÀÌ ´Ã¾î³­´Ù. ÀÌÁ¦ UTF-8 ¹®¼­³ª À¯´ÏÄÚµå ºò ¿£µð¾Èµµ Àß ¿­¸°´Ù.

³ª.°³ÇàÄÚµå Á¡°Ë

ÀÏ¹Ý ÅؽºÆ® Æ÷¸Ëµµ °³Çà ÄÚµåÀÇ ÇüÅ¿¡ µû¶ó ¼¼ °¡Áö Á¾·ù°¡ Àִµ¥ °¡²û °³Çà Äڵ尡 ¸¶±¸ ¼¯¿© ÀÖ´Â ÀÏ°ü¼º¾ø´Â ¹®¼­µµ ÀÖ´Ù. ApiEdit´Â ù ¹ø° ¸¸³ª´Â °³Çà ÄÚµå·Î ¹®¼­ Æ÷¸ËÀ» °áÁ¤Çϴµ¥ µÎ ¹ø° ÀÌÈÄÀÇ °³Çà Äڵ尡 ù ¹ø°¿Í Ʋ¸± °æ¿ì º¯È¯À» ¼öÇàÇÏÁö ¾ÊÀ¸¹Ç·Î °³ÇàÀÌ Á¦´ë·Î ¾ÈµÉ ¼öµµ ÀÖ´Ù. »ùÇà ¹®¼­ Áß¿¡ "°³ÇàÄÚµå.txt"¸¦ ÀоÀÚ.

¾ÕÂÊ µÎ °³ÀÇ °³Çà ÄÚµå´Â \r\nÀ̹ǷΠÀ©µµ¿ìÁî Æ÷¸ËÀ¸·Î ÆǺ°ÇÏÁö¸¸ µÚÂÊÀÇ °³Çà ÄÚµå´Â \n¸¸ Àְųª \r¸¸ ÀÖ¾î ±×·¡ÇÈ ¹®ÀÚ·Î ³ªÅ¸³­´Ù. ¹®¼­¸¦ Á¦´ë·Î Ãâ·ÂÇϱâ À§Çؼ­´Â ÀÌ·± °³Çà Äڵ嵵 °­Á¦·Î ±ÔÄ¢¿¡ ¸Â°Ô º¯È¯ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ApiEdit¿¡ ´ÙÀ½ µÎ ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù.

 

// °³Çà ÄÚµåÀÇ ÀÏ°ü¼º °Ë»ç

BOOL CApiEdit::TestEnterCode(TCHAR *TextBuf, int dwSize)

{

     TCHAR *s;

 

     for (s=TextBuf;s-TextBuf < dwSize;s++) {

          if ((*s == '\r' && (s-TextBuf == dwSize || *(s+1) != '\n')) ||

              (*s == '\n' && (s-TextBuf == 0 || *(s-1) != '\r'))) {

              return FALSE;

          }

     }

     return TRUE;

}

 

// °³ÇàÄڵ带 \r\nÀ¸·Î °­Á¦ Á¶Á¤

int CApiEdit::FixEnterCode(TCHAR *TextBuf, int dwSize, TCHAR *&dest)

{

     TCHAR *s,*d;

 

     dest=(TCHAR *)malloc(dwSize*2);

     for (s=TextBuf,d=dest;s-TextBuf < dwSize;s++,d++) {

          if ((*s == '\r' && (s-TextBuf == dwSize || *(s+1) != '\n')) ||

              (*s == '\n' && (s-TextBuf == 0 || *(s-1) != '\r'))) {

              *d++='\r';

              *d='\n';

          } else {

              *d=*s;

          }

     }

     return d-dest;

}

 

°³Çà ÄÚµåÀÇ Æ÷¸ËÀÌ ¸Â´ÂÁö¸¦ Á¡°ËÇÏ´Â ÇÔ¼ö¿Í °­Á¦·Î Á¶Á¤ÇÏ´Â ÇÔ¼öÀÌ´Ù. °³Çà Äڵ尡 ±ÔÄ¢¿¡ ¸ÂÁö ¾ÊÀ» Á¶°ÇÀº ´ÙÀ½ µÎ °¡ÁöÀÌ´Ù.

 

\rÀ» ¸¸³µ´Âµ¥ µÚ¿¡ \nÀÌ ¾øÀ» ¶§

\nÀ» ¸¸³µ´Âµ¥ ¾Õ¿¡ \rÀÌ ¾øÀ» ¶§

 

½±°Ô ¸»Çؼ­ \\r\nÀÌ ¿¬ÀÌ¾î ¿Í¾ß¸¸ °³ÇàÄÚµå ±ÔÄ¢¿¡ ¸Â´Â °ÍÀÌ´Ù. ´Ü, µÎ °æ¿ì ¸ðµÎ ¾ÕµÚ ¹ÙÀÌÆ®¸¦ Á¡°ËÇÒ ¶§ ¹®¼­ÀÇ ¹üÀ§¿¡ ¼ÓÇØ ÀÖ´Â ¹ÙÀÌÆ®ÀÎÁö¸¦ ¸ÕÀú Á¡°ËÇØ¾ß ÇÑ´Ù. °³Çà Äڵ带 Á¶Á¤ÇÒ ¶§´Â dest¿¡ ÃæºÐÇÑ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ ÈÄ TextBufÀÇ ³»¿ëÀ» ±×´ë·Î º¹»çÇÏµÇ È¦·Î ÀÖ´Â \rÀ̳ª \nÀ» ¸¸³ª¸é \r\nÀ» °­Á¦·Î Ãâ·ÂÇÏ¸é µÈ´Ù. Á¶Á¤ °á°ú ±æÀÌ°¡ ¹Ù²ð ¼öµµ ÀÖÀ¸¹Ç·Î »õ ±æÀ̸¦ ¸®ÅÏÇÑ´Ù. ÆíÁýâ¿¡ ÅؽºÆ®¸¦ »ðÀÔÇÒ ¶§ °³ÇàÄÚµåÀÇ ÀÏ°ü¼ºÀ» Á¡°ËÇÑ´Ù.

 

void CApiEdit::SetText(TCHAR *TextBuf, int dwSize)

{

     TCHAR *dest;

     int len;

    TCHAR *fixed;

 

     InitDoc();

     dwFormat=AnalyzeFormat(TextBuf, dwSize);

     switch (dwFormat) {

     case AE_FORMAT_WIN:

     case AE_FORMAT_BINARY:

        if (TestEnterCode(TextBuf,dwSize)==FALSE) {

           len=FixEnterCode(TextBuf,dwSize,fixed);

           GetActiveView()->Insert(0,fixed,len,FALSE);

           free(fixed);

        } else {

           GetActiveView()->Insert(0,TextBuf,dwSize,FALSE);

        }

        break;

 

À©µµ¿ìÁî Æ÷¸ËÀÇ ÅؽºÆ®ÀÎ °æ¿ì °³Çà Äڵ尡 ¸ðµÎ ¸Â´ÂÁö º¸°í ±×·¸Áö ¾Ê´Ù¸é Á¶Á¤ÇÑ ÈÄ »ðÀÔÇÑ´Ù. Á¶Á¤ ÇÔ¼ö°¡ ³»ºÎ¿¡¼­ ¸Þ¸ð¸®¸¦ ÇÒ´çÇؼ­ ¸®ÅÏÇϹǷΠÀÌ ¸Þ¸ð¸®´Â È£Ãâ¿ø¿¡¼­ ÇØÁ¦ÇØ¾ß ÇÑ´Ù. À¯´Ð½º¿Í ¸ÅŲÅä½Ã Æ÷¸ËÀº º¯È¯ ½ÃÁ¡¿¡ Á÷Á¢ Á¶Á¤ÇÑ´Ù.

 

int CApiEdit::ConvertFormat(DWORD from, DWORD to, TCHAR *src, int srclen, TCHAR *&dest)

{

     int need,i,num;

     TCHAR *s,*d;

    TCHAR Find, Other;

     LPWSTR t;

     ....

     if (to==AE_FORMAT_WIN) {

          switch (from) {

          case AE_FORMAT_UNIX:

              Find='\n';

           Other='\r';

              break;

          case AE_FORMAT_MAC:

              Find='\r';

           Other='\n';

              break;

          }

          while (s-src < srclen) {

           if (*s == Other) {

               s++;

               continue;

            }

              if (*s==Find) {

                   *d++='\r';

                   *d++='\n';

                   s++;

              } else {

                   *d++=*s++;

              }

          }

          *d=0;

     } else {

          ....

 

Other¿¡ Æ÷¸Ë¿¡ ¸ÂÁö ¾ÊÀº Äڵ带 ´ëÀÔÇÏ°í ÀÌ Äڵ尡 ¹ß°ßµÇ¸é ¹«Á¶°Ç »èÁ¦ÇØ ¹ö¸®´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾î À¯´Ð½º ¹®¼­´Â \n¸¸À¸·Î °³ÇàÀ» Ç¥ÇöÇϹǷΠ\rÀº ¿Ã ¼ö ¾ø´Ù. ±×·±µ¥ Æ÷¸Ë ºÐ¼® ·çƾ¿¡¼­ \r°ú \nÀÌ µ¿½Ã¿¡ ¿À¸é ¹«Á¶°Ç À©µµ¿ìÁî Æ÷¸ËÀ¸·Î ÆǺ°Çϱ⠶§¹®¿¡ ÀÌ ÄÚµå´Â ÇöÀç´Â µ¿ÀÛÇÒ ±âȸ°¡ ¾ø´Ù.

 

ÀÌ»óÀ¸·Î ApiEdit¿¡ Á» ´õ ´Ù¾çÇÑ Æ÷¸Ë Áö¿ø Äڵ带 ÀÛ¼ºÇߴµ¥ ÇöÀç »óȲ¿¡¼­ ÀÌ Á¤µµ Æ÷¸Ë¸¸ Áö¿øÇصµ ¾²±â¿¡ ºÒÆíÇÏÁö´Â ¾ÊÀ» °ÍÀÌ´Ù. ±×·¯³ª ³»ºÎ Æ÷¸ËÀÌ ¾È½Ã·Î µÇ¾î ÀÖ¾î À¯´ÏÄÚµå ¹®¼­¸¦ ¿­°í ÀúÀåÇÏ´Â ¼Óµµ°¡ ´À¸®´Ù. À¯´ÏÄڵ尡 ¾Æ¹«¸® ´ë¼¼¶ó°í Çصµ ¾ÆÁ÷±îÁö ´ëºÎºÐÀÇ ÅؽºÆ® ÆÄÀÏÀÌ ¾È½Ã Æ÷¸ËÀ¸·Î µÇ¾î ÀÖ¾î ±×³ª¸¶ ´ÙÇེ·´´Ù. ÇÏÁö¸¸ ÀÌ·± »óȲÀÌ ¾ðÁ¦ ¾î¶»°Ô ¹Ù²ðÁö´Â Àå´ãÇϱ⠾î·Æ´Ù.

¶ÇÇÑ ¾È½Ã´Â ¿©·¯ ³ª¶óÀÇ ¹®ÀÚ¸¦ µ¿½Ã¿¡ Ç¥ÇöÇÒ ¼ö ¾ø±â ¶§¹®¿¡ ±¹Á¦È­¿¡ ºÒ¸®ÇÏ´Ù. Çѱ۰ú ¿µ¹®¸¸ »ç¿ëÇÑ´Ù¸é ±×·° Àú·° ¾µ¸¸ÇÏ°ÚÁö¸¸ ÀϺ»¾î³ª Áß±¹¾î·Î µÈ ¹®¼­´Â ¿­Áö ¸øÇÑ´Ù. ÀÌ·± ¹®Á¦¸¦ ÇØ°áÇÏ·Á¸é ³»ºÎ Æ÷¸ËÀ» µû·Î µÎÁö ¸»°í ÆÄÀÏÀÇ °íÀ¯ Æ÷¸Ë ±×´ë·Î ÆíÁýÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ±×·¸°Ô ÇÏÀÚ¸é °¢ Æ÷¸ËÀÇ °³Çà ¹æ½Ä, ¹®ÀÚ¿­ ºñ±³ ¹æ½Ä, °Ë»ö ¹æ½Ä, ¾ÕµÚ·Î À̵¿ÇÏ´Â ¹æ½Ä µîÀÌ ¸ðµÎ ´Þ¶ó Äڵ尡 ±²ÀåÈ÷ º¹ÀâÇØÁö´Âµ¥ Æ÷¸Ë¸¸À» Àü¹®ÀûÀ¸·Î ´Ù·ç´Â °´Ã¼¸¦ µû·Î µÎ¾î¾ß ÇÑ´Ù.

ÄÚµåÀÇ ¿©±â Àú±â¸¦ ´ë´ëÀûÀ¸·Î ¼öÁ¤ÇØ¾ß ÇÏ´Â ¹ø°Å·Î¿òÀÌ ÀÖÁö¸¸ ´çºÐ°£Àº ÀÌ ¹®Á¦¸¦ Àá½Ã Á¢¾î ³õÀ» »ý°¢ÀÌ´Ù. ÇöÀç ±¸Á¶·Î¼­´Â ³Ê¹«³ª ¸¹Àº ºÎºÐÀ» ¼öÁ¤ÇØ¾ß ÇϹǷΠ°ÅÀÇ ºÒ°¡´ÉÇÏ¸ç ´õ±¸³ª ¼³¸í ¹®¼­¸¦ ÀÛ¼ºÇÏ´Â °ÍÀº °ÅÀÇ ¾Ç¸ùÀÏ °Í °°´Ù. ÇÏÁö¸¸ ¾ðÁ¨°¡´Â ¸ðµç Æ÷¸ËÀ» È¿À²ÀûÀ¸·Î ´Ù·ê ¼ö ÀÖ´Â ±¸Á¶·Î ¼öÁ¤ÇÒ °èȹÀÌ´Ù.