본문 바로가기

쓰기

텍스트파일을

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

#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/e44/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 [플러그인,소스] FixLine 테스트버전 081214_2 file Hide_D 12524   2008-12-15 2008-12-15 00:04
 
248 Archive [플러그인,소스] FixLine 테스트버전 081215 [5] file Hide_D 15213   2008-12-15 2008-12-16 01:18
 
247 Talk Small Talk + StrongRoom = New Small Talk! Hide_D 12177   2008-12-16 2008-12-16 00:06
다시 통합 완료했습니다. 카테고리는 3개로 돌아갑니다. Talk : 내용 무 Archive : 플러그인 관련 파일들이 올라갑니다. OtherFiles : 플러그인 관련은 아니지만 파일인 경우! 카테고리 작업도 완료했습니다.  
246 OtherFiles 히데님, 픽스라인 관련 메모장 파일입니다. [1] file astral 15603   2008-12-16 2008-12-16 01:19
 
245 Archive [소스] ATCode 테스트버전 20081203 file whoami 11548   2008-12-16 2009-01-06 00:51
 
244 OtherFiles [프로그램] 필터 테스트 프로그램 [13] file Hide_D 27998   2008-12-16 2013-06-22 22:20
 
243 Archive [플러그인,소스] FixLine 테스트버전 081216 file Hide_D 12340   2008-12-16 2008-12-16 13:20
 
242 OtherFiles fixline 테스트 [1] file 처음처럼만 15297   2008-12-16 2008-12-16 15:52
 
241 OtherFiles fixline 테스트 2차 file 처음처럼만 13341   2008-12-16 2008-12-16 15:52
 
240 Talk FixLine 테스트버전 081215 [1] file 그레이 20429   2008-12-16 2008-12-16 16:37
 
239 OtherFiles fixline 테스트 3차 [2] file 처음처럼만 16074   2008-12-16 2008-12-30 08:53
 
238 Archive [플러그인,소스] FixLine 테스트버전 081217 file Hide_D 12415   2008-12-17 2008-12-17 23:38
 
237 Talk [오류보고]ATcode 버퍼크기 무시 버그 [1] file HaruKaze 12813   2008-12-18 2009-01-06 00:56
 
236 Archive [플러그인,소스] FixLine 테스트버전 081219 file Hide_D 11449   2008-12-19 2008-12-19 13:03
 
235 Talk ezTransXP 플러그인 버그 =ㅅ=?? [2] Hide_D 12427   2008-12-20 2009-01-06 00:47
단순씨 사전 45608개 짜리 버전으로 테스트했을때 「すごい! えらい!! カッコイイ!!! さすが僕らのトライオン!」 이걸 번역하면 「대단해<히)! 대단하다! 멋있어! 과연 우리들의 트라이 온!」 요렇게 나오는데, 아랄트랜스에서 괄호제거 옵션을 ...  
234 Archive [플러그인,소스] FixLine 테스트버전 081220_2 [2] file Hide_D 13376   2008-12-20 2008-12-21 08:29
 
233 Archive [플러그인,소스] FixLine 테스트버전 081221 [5] file Hide_D 15475   2008-12-21 2008-12-22 02:30
 
232 Archive [플러그인,소스] FixLine RC 081222 file Hide_D 12576   2008-12-22 2008-12-22 11:55
 
231 Talk 아아아아앍 cmd /u !!!!!!!!!!!!!!!!!! [1] Hide_D 12323   2008-12-22 2009-01-06 00:47
cmd /? 해서 살펴보고 있는데 /u 플래그가 있었군요 /U 파이프 또는 파일로의 내부 명령어의 출력을 Unicode로 설정합니다. dir /s /b > UniDir.txt 로 했더니 UTF16-LE BOM없음으로 저장되는군요. 옴마야. 왜 모르고있었지  
230 Archive [플러그인,소스] FixLine RC2 081223 [4] file Hide_D 17424   2008-12-23 2008-12-30 08:50