본문 바로가기

쓰기

텍스트파일을

특정 인코딩에 따라서 읽거나 쓰는 라이브러리 되겠습니다.

#define MBCS                    0
#define UTF16LE_BOM        2
#define UTF16LE_NOBOM    3
#define UTF16BE_BOM        4
#define UTF16BE_NOBOM    5
#define UTF8_BOM                6
#define UTF8_NOBOM            7

LPWSTR FileOpen(LPCWSTR cszFilePath,int nUnicode=UTF16LE_BOM,int nEncoding=CP_UTF8);
LPWSTR FileOpen(LPCWSTR cszFilePath,vector<wstring>* arText,
                             int nUnicode=UTF16LE_BOM,int nEncoding=CP_UTF8);

void FileSave(LPCWSTR cszFilePath,LPCWSTR pszText,
                      int nUnicode=UTF16LE_BOM,int nEncoding=CP_UTF8);
void FileSave(LPCWSTR cszFilePath,vector<wstring>* arText,
                       int nUnicode=UTF16LE_BOM,int nEncoding=CP_UTF8);

파일에 BOM이 설정되어 있는 경우에는
nUnicode값에 상관없이 (MBCS일지라도!)
BOM에 맞는 값을 읽어옵니다.

vector를 이용한 함수를 사용할 경우
'줄 단위'로 잘라져서 들어갑니다.

사용법
LPWSTR pszText = FileOpen(L"Temp.txt",UTF8_NOBOM);

vector arText<wstring>;
FileOpen(L"Temp.txt",&arText,MBCS,932);

arText.push_back(L"내용 추가");
arText.push_back(L"줄 추가");


FileSave(L"Out.txt",pszText);

FileSave(L"Out2.txt",&arText,UTF16BE_BOM);

참고1.
FileOpen할때 인코딩 지정은
BOM이 없는 파일을 기준으로 해주는것이 좋습니다.

예를 들자면
'UTF16LE_NOBOM'
'MBCS,949'

참고2.
FileOpen에서 vector를 사용하는 함수값의
반환값이 LPWSTR이긴 하지만,
이 경우에는 무조건 NULL이 반환됩니다.
오버로딩 때문에 적용된 '꼼수'일 뿐이니 실수하지 않도록 해주세요 ^^;

참고3.
Visual Studio 2005에서 작성하였지만
라이브러리 파일 자체는 어느 버전에서든 잘 작동할거라고 봅니다
조회 수 :
11830
등록일 :
2009.02.01
02:55:25
엮인글 :
https://arallab.hided.net/4257/fb2/trackback
게시글 주소 :
https://arallab.hided.net/board_devtalk/4257

마이아크

2009.02.01
03:00:13
수고하셨어요~~~~~~

HaruKaze

2009.02.01
12:37:54
감사합니다. 잘 사용하겠습니다...(_ _)

호기심맨

2009.02.01
19:59:37
이야 진짜 편하겠는데요 잘 쓰겠습니다.~

HaruKaze

2009.02.08
17:58:08
유니코드 파일을 오픈 할 경우 라인이 한줄씩 더 생기는 문제가 발생하네요..ㅠ.ㅠ

그리고 건의드리고 싶은게 nUnicode를 인자로 주고 받을것이 아니라 코드페이지를 참조해서 수행하면 좋을것 같아요. 단 유니코드일 경우에는 반드시 BOM 첨가로...

저장쪽은 일단 난잡하게 수정해서 해결은 했는데 오픈쪽은 손을 못대겠어요...ㄷㄷ

일단 수정한 부분은 다음...

 void FileSave(LPCWSTR cszFilePath,LPCWSTR pszText,int nEncoding)
{
    HANDLE hFile=NULL;
    char * arText=NULL;
    DWORD nDestSize=0;
    try
    {
        hFile = CreateFile(cszFilePath,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
        if(hFile==NULL)
            throw 1;

        //메모리 생성
        DWORD nSrcSize=lstrlenW(pszText);
        arText = new char[nSrcSize*3+100]; //닥치고 3배
        memset(arText,0x00,nSrcSize*3+100);

        /* nUnicode
        0: MBCS
        2: UTF-16LE BOM
        4: UTF-16BE BOM
        6: UTF-8 BOM
        (2,4,6 +1 : NO-BOM)
        */
        
        int nSrc=0;
        bool bCross0=0;
        bool bCross1=1;
        bool bLE=false;
        bool bBOM=false;
        //int nUnicode=0;
        
        switch(nEncoding)
        {
        case 1200:
            //UTF-16LE BOM
            bLE=true;
        case 1201:
            //UTF-16BE BOM
            bBOM=true;
        //case 3:
        //    //UTF-16LE
        //    if(nUnicode==3)
        //        bLE=true;
        //case 5:
        
            //UTF-16BE

            //작업 개시

            //바이트 크로스작업
            if(!bLE)
            {
                bCross0=1;
                bCross1=0;
            }

            //BOM삽입
            if(bBOM)
            {
                dByte.wc=(DWORD)0xFEFF;
                arText[nDestSize++]=(char)dByte.sc[bCross0];
                arText[nDestSize++]=(char)dByte.sc[bCross1];
            }

            while(pszText[nSrc]!=L'')
            {
                if(pszText[nSrc]==L'r')
                {
                    dByte.wc=L'r';
                    arText[nDestSize++]=(char)dByte.sc[bCross0];
                    arText[nDestSize++]=(char)dByte.sc[bCross1];

                    dByte.wc=L'n';
                    arText[nDestSize++]=(char)dByte.sc[bCross0];
                    arText[nDestSize++]=(char)dByte.sc[bCross1];
                }
                else if(pszText[nSrc]==L'n')
                {
                    
                }
                else
                {
                    dByte.wc=pszText[nSrc];
                    arText[nDestSize++]=(char)dByte.sc[bCross0];
                    arText[nDestSize++]=(char)dByte.sc[bCross1];
                }
                nSrc++;
            }

            break;

        case 65001:
            //UTF-8 BOM
            nEncoding=CP_UTF8;
            arText[nDestSize++]=(char)0xEF;
            arText[nDestSize++]=(char)0xBB;
            arText[nDestSize++]=(char)0xBF;
            bBOM=true;
        
        default:
            //MBCS or Default UTF-8 (NO BOM)
            //nUnicode=0;
            DWORD dByte=nSrcSize*3+100;
            if(bBOM)
                nDestSize=WideCharToMultiByte(nEncoding,0,pszText,-1,arText+3,dByte-3,0,0)+3;
            else
                nDestSize=WideCharToMultiByte(nEncoding,0,pszText,-1,arText,dByte,0,0);
            
            /////////  Modified by Haru 2009-02-08 /////////
            //
            strcmp(arText,(LPSTR) pszText);        // Added
            
            // Removed
            //int nRet=0;

            //for(DWORD i=0;i<nDestSize;i++)
            //{
            //    if(arText[i]=='n')
            //    {
            //        nRet++;
            //    }
            //}

            //nDestSize+=nRet;

            //for(int i=nDestSize-1-nRet;i>=0;i--)
            //{
            //    if(arText[i]=='n')
            //    {
            //        arText[i+nRet--]='n';
            //        arText[i+nRet]='r';
            //    }
            //    else
            //    {
            //        if(nRet==0)
            //            break;

            //        arText[i+nRet]=arText[i];
            //    }
            //}
            /////////////////////////////////////////

            break;
        }
        if(nEncoding!=1200 && nEncoding!=1201 && nEncoding!=65001)
            nDestSize--;
        WriteFile(hFile,arText,nDestSize,&nDestSize,0);

        delete[]arText;
        CloseHandle(hFile);

    }
    catch (int nErr)
    {
        delete[]arText;
        CloseHandle(hFile);
    }
}


Hide_D

2009.02.09
00:37:47
Visual C++ 전용으로 만들어졌습니다[...]
VB와 연동하는경우에는 어떻게 되는지 저도 잘 모릅니다 -_-;
List of Articles
번호 제목 글쓴이 조회 수sort 추천 수 날짜 최근 수정일
공지 Talk [필독] 테스트필터 사용시 주의사항 라파에 155439   2008-08-03 2008-12-16 00:03
249 Archive [플러그인, 소스] preKoFilter 테스트 버전 20080715 [1] file whoami 9883   2008-07-15 2009-01-06 01:00
 
248 Archive [플러그인, 소스] CmdFilter 테스트 버전 20080712_2 file whoami 9884   2008-07-12 2009-01-06 01:00
 
247 Talk 현재까지 작업물 + 에러 OTL [2] file Hide_D 9891   2008-08-03 2008-08-03 21:08
 
246 Archive [플러그인,소스] 사용자 사전 플러그인 0.1 20080718 (테스트 버전) [1] file Hide_D 9905   2008-07-18 2009-01-06 01:00
 
245 Talk CustomSD 원문 단어 흘리기 결과. [2] whoami 9910   2008-08-10 2009-01-06 02:06
제가 다른분이 제작하신 플러그인 테스트를 하게 될줄은.. 어쨌든. 원문 - 誰だ⑤ 誰なんだよ⑤@n美奈⑤ そいつは誰なんだ⑤ 번역 - 누구다⑤ 누구이에요놡@n미나⑤ 그 녀석은 누구야 놡 단어 흘리기 (?) 가 되다 안되다 하는군요. 중간에 "놡" 은 된 것이고.. ⑤ ...  
244 Archive [플러그인] DumpText Hotfix 20080824 [4] file Hide_D 9957   2008-08-24 2009-01-06 01:05
 
243 Talk 관리자님께 '옵션코드 입력'에 관해서 요청~ Hide_D 9990   2009-01-03 2009-01-03 11:02
일반적으로 아랄트랜스에서 '옵션'을 긁어 온다면 두가지 방법으로 긁어올수 있습니다. /a:ATCode{HOOK(0x004016B0,TRANS([ESP+0x8],PTRCHEAT))} /f:DumpText{SET(10100)} /t:ezTransXP{} 이 형식과 HOOK(0x004016B0,TRANS([ESP+0x8],PTRCHEAT)) DumpText{SET(...  
242 Talk 다음 계획 [1] Hide_D 9995   2008-08-10 2009-01-06 01:33
1. 개행 문자 처리 사용자가 정한 문자열(hex나 문자열중 하나 선택해서 입력)으로 벽을 뚫지 않도록[...] 개행문자를 처리해주는 기능 번역률 향상도 기해 할 수 있을듯. 2. 사용자 대본 기능 관련 http://koreajapan.pe.kr/make.htm 이녀석 문법 귀찮네요[.....  
241 Archive [플러그인, 소스] CmdFilter 테스트 버전 20080730 [2] file whoami 10233   2008-07-30 2009-01-06 01:26
 
240 Archive [플러그인] OutRuby 테스트 버전 20080927 [2] file Hide_D 10236   2008-09-27 2008-10-12 03:58
 
239 Archive (수정) 하루카제님 요청하신 VB용번역dll입니다. [2] file 호기심맨 10250   2009-01-07 2009-01-08 00:54
 
238 Talk 으아아앍 SVN [1] Hide_D 10267   2008-09-27 2009-01-06 01:24
구조가 꼬였네요 orz 어쩌지[...]  
237 Archive [플러그인, 소스] preKoFilter 테스트 버전 20080712 file whoami 10275   2008-07-12 2009-01-06 01:00
 
236 Archive 임시 소스 보관 DumpText2 file Hide_D 10305   2008-10-11 2009-01-06 01:52
 
235 Talk RLCmd, KoFilter 의 디버그 로그 기능에 대해 - 2 whoami 10308   2008-07-28 2009-01-06 01:26
현재 정식버전에 디버그 로그기능은 살아있습니다. 단, 일반 사용자가 건드릴 수 없도록 옵션창에는 빠져 있습니다. 사용하시려면.. 멀티플러그인의 옵션 직접입력 창에서 집어넣거나 바로가기 편집에서 직접 넣어주시기 바랍니다.  
234 Archive [플러그인, 소스] DenyWord 테스트 버전 20080910 [1] file Hide_D 10322   2008-09-10 2009-01-06 01:01
 
233 Talk 하루카 원문 [1] 나는누구인감? 10337   2008-09-16 2008-09-17 01:00
원문  
232 Talk 죄송해요 ㅠ_ㅠ SVN 위치 trunk -> trunk2 로 옮겨주세요. Hide_D 10477   2008-10-01 2009-01-06 01:24
제가 세팅을 잘못한 모양인지 trunk 그 상태로는 도저히 원상 복구가 안되네요 ㅠ_ㅠ 죄송합니다 위치를 trunk에서 trunk2로 바꿔주시면 감사하겠습니다  
231 Talk AT 0.3 재설계 프로젝트 [1] 아랄 10551   2011-04-16 2011-04-17 09:52
1. 인젝터-서버 방식 2. IDE = vs2010 3. AT 0.3에서 시도하려 했던 중복 기능의 모듈화는 유효, 모듈 명명은 언제든 변할 수 있음 FontMapper, UITrans 4. 스크립트 엔진 = v8 5. 각 플러그인은 운용중인 파일을 반환하는 인터페이스를 가져야 함 6. Launcher...  
230 Talk 토모요 애프터...... [2] file whoami 10576   2008-08-26 2009-01-06 02:04