ÅؽºÆ® ÆÄÀÏÀº ¹®ÀÚ¹Û¿¡ ¾ø´Â ¾ÆÁÖ ´Ü¼øÇÑ Æ÷¸ËÀÎ °Í °°Áö¸¸ À̰͵µ ÀÎÄÚµù ¹æ½Ä¿¡ µû¶ó ¾ÆÁÖ ¸¹Àº Á¾·ù°¡ ÀÖ¾î ÀÌÁø ÆÄÀϺ¸´Ù ¿ÀÈ÷·Á °ü¸®Çϱ⠴õ ±î´Ù·Î¿î ÆíÀÌ´Ù. 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¿¡ Á» ´õ ´Ù¾çÇÑ Æ÷¸Ë Áö¿ø Äڵ带 ÀÛ¼ºÇߴµ¥ ÇöÀç »óȲ¿¡¼ ÀÌ Á¤µµ Æ÷¸Ë¸¸ Áö¿øÇصµ ¾²±â¿¡ ºÒÆíÇÏÁö´Â ¾ÊÀ» °ÍÀÌ´Ù. ±×·¯³ª ³»ºÎ Æ÷¸ËÀÌ ¾È½Ã·Î µÇ¾î ÀÖ¾î À¯´ÏÄÚµå ¹®¼¸¦ ¿°í ÀúÀåÇÏ´Â ¼Óµµ°¡ ´À¸®´Ù. À¯´ÏÄڵ尡 ¾Æ¹«¸® ´ë¼¼¶ó°í Çصµ ¾ÆÁ÷±îÁö ´ëºÎºÐÀÇ ÅؽºÆ® ÆÄÀÏÀÌ ¾È½Ã Æ÷¸ËÀ¸·Î µÇ¾î ÀÖ¾î ±×³ª¸¶ ´ÙÇེ·´´Ù. ÇÏÁö¸¸ ÀÌ·± »óȲÀÌ ¾ðÁ¦ ¾î¶»°Ô ¹Ù²ðÁö´Â Àå´ãÇϱ⠾î·Æ´Ù.
¶ÇÇÑ ¾È½Ã´Â ¿©·¯ ³ª¶óÀÇ ¹®ÀÚ¸¦ µ¿½Ã¿¡ Ç¥ÇöÇÒ ¼ö ¾ø±â ¶§¹®¿¡ ±¹Á¦È¿¡ ºÒ¸®ÇÏ´Ù. Çѱ۰ú ¿µ¹®¸¸ »ç¿ëÇÑ´Ù¸é ±×·° Àú·° ¾µ¸¸ÇÏ°ÚÁö¸¸ ÀϺ»¾î³ª Áß±¹¾î·Î µÈ ¹®¼´Â ¿Áö ¸øÇÑ´Ù. ÀÌ·± ¹®Á¦¸¦ ÇØ°áÇÏ·Á¸é ³»ºÎ Æ÷¸ËÀ» µû·Î µÎÁö ¸»°í ÆÄÀÏÀÇ °íÀ¯ Æ÷¸Ë ±×´ë·Î ÆíÁýÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ±×·¸°Ô ÇÏÀÚ¸é °¢ Æ÷¸ËÀÇ °³Çà ¹æ½Ä, ¹®ÀÚ¿ ºñ±³ ¹æ½Ä, °Ë»ö ¹æ½Ä, ¾ÕµÚ·Î À̵¿ÇÏ´Â ¹æ½Ä µîÀÌ ¸ðµÎ ´Þ¶ó Äڵ尡 ±²ÀåÈ÷ º¹ÀâÇØÁö´Âµ¥ Æ÷¸Ë¸¸À» Àü¹®ÀûÀ¸·Î ´Ù·ç´Â °´Ã¼¸¦ µû·Î µÎ¾î¾ß ÇÑ´Ù.
ÄÚµåÀÇ ¿©±â Àú±â¸¦ ´ë´ëÀûÀ¸·Î ¼öÁ¤ÇØ¾ß ÇÏ´Â ¹ø°Å·Î¿òÀÌ ÀÖÁö¸¸ ´çºÐ°£Àº ÀÌ ¹®Á¦¸¦ Àá½Ã Á¢¾î ³õÀ» »ý°¢ÀÌ´Ù. ÇöÀç ±¸Á¶·Î¼´Â ³Ê¹«³ª ¸¹Àº ºÎºÐÀ» ¼öÁ¤ÇØ¾ß ÇϹǷΠ°ÅÀÇ ºÒ°¡´ÉÇÏ¸ç ´õ±¸³ª ¼³¸í ¹®¼¸¦ ÀÛ¼ºÇÏ´Â °ÍÀº °ÅÀÇ ¾Ç¸ùÀÏ °Í °°´Ù. ÇÏÁö¸¸ ¾ðÁ¨°¡´Â ¸ðµç Æ÷¸ËÀ» È¿À²ÀûÀ¸·Î ´Ù·ê ¼ö ÀÖ´Â ±¸Á¶·Î ¼öÁ¤ÇÒ °èȹÀÌ´Ù.