본문 바로가기

쓰기

텍스트파일을

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

#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/f27/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
209 Archive [플러그인] FixLine 테스트버전 081231_2 [1] file Hide_D 10702   2008-12-31 2008-12-31 21:48
 
208 Archive [플러그인] FixLine 테스트버전 081230 [4] file Hide_D 13238   2008-12-30 2008-12-31 00:39
 
207 Talk 음 제가 컴퓨터를 못하는 사람이라 뻘글일 수도 있겠지만.. [2] 쥬빌 14389   2008-12-30 2008-12-30 12:14
아랄 트랜스의 장점이 게임상의 대사가 바로 한글로 변환 표기되는 것이라 보는데요. 번역률을 높이기 위해 번역본이 있는 게임들은 ez트랜스가 아닌, 미연시 번역본 text과 연동하여 쓸수는 없을까요? ez와의 연동 구조를 잘 모르겠으나..게임상의 일어를 ez...  
206 Talk 히데님이 말씀하신 테스트파일 [2] file 유르_리샤 11530   2008-12-29 2008-12-30 08:25
 
205 Talk Fixline용 텍스트 파일.... [3] file 처음처럼만 11753   2008-12-29 2008-12-30 09:02
 
204 Talk 필터에 MFC로 모달리스 창을 띄웠을때=ㅅ=; [4] file Hide_D 13934   2008-12-27 2008-12-30 08:29
 
203 Talk FixLine 23일자 파일은 무시설정에 문제가 있는듯하네요 [7] 류제로 15841   2008-12-26 2008-12-30 08:30
이번에 올라온 종말능의를 코드를 입력시켜면서 알게된 것인데 23일자 FixLine 옵션의 무시설정의 서클체크을 사용안함 이외 부분을 체크하고 확인을 누르면 적용은 되는듯하나 다시 옵션창을 열어보면 체크가 사용 안함으로 표시 되어있습니다 20일자로 실행...  
202 Talk 쓰레드를 사용하려고 하는데 제대로 안되네요; [2] Hide_D 10808   2008-12-25 2008-12-26 22:53
음 일단 쓰레드를 사용하는 파일은 CAutoLoad 클래스 하나뿐이구요. CustomDic에 포함됩니다. 5초마다 한번씩 파일리스트에 등록된 파일의 수정된 날짜를 체크해서 새로 갱신된것이면 새로 읽는다...라는 기능을 가지고 있는데, 애초부터 쓰레드가 동작조차 하...  
201 Talk 기리기리 [] 함수 내부 처리 [1] Hide_D 12463   2008-12-23 2008-12-30 08:49
이것이 , 나의[荷物'ざいさん]의 모두였다. [ ' ] 로 나오는 경우 추가로 루비로 처리되는 모양입니다 이거 추가해둬야겠네요.  
200 Archive [플러그인,소스] FixLine RC2 081223 [4] file Hide_D 17424   2008-12-23 2008-12-30 08:50
 
199 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없음으로 저장되는군요. 옴마야. 왜 모르고있었지  
198 Archive [플러그인,소스] FixLine RC 081222 file Hide_D 12576   2008-12-22 2008-12-22 11:55
 
197 Archive [플러그인,소스] FixLine 테스트버전 081221 [5] file Hide_D 15475   2008-12-21 2008-12-22 02:30
 
196 Archive [플러그인,소스] FixLine 테스트버전 081220_2 [2] file Hide_D 13376   2008-12-20 2008-12-21 08:29
 
195 Talk ezTransXP 플러그인 버그 =ㅅ=?? [2] Hide_D 12427   2008-12-20 2009-01-06 00:47
단순씨 사전 45608개 짜리 버전으로 테스트했을때 「すごい! えらい!! カッコイイ!!! さすが僕らのトライオン!」 이걸 번역하면 「대단해<히)! 대단하다! 멋있어! 과연 우리들의 트라이 온!」 요렇게 나오는데, 아랄트랜스에서 괄호제거 옵션을 ...  
194 Archive [플러그인,소스] FixLine 테스트버전 081219 file Hide_D 11449   2008-12-19 2008-12-19 13:03
 
193 Talk [오류보고]ATcode 버퍼크기 무시 버그 [1] file HaruKaze 12813   2008-12-18 2009-01-06 00:56
 
192 Archive [플러그인,소스] FixLine 테스트버전 081217 file Hide_D 12415   2008-12-17 2008-12-17 23:38
 
191 OtherFiles fixline 테스트 3차 [2] file 처음처럼만 16074   2008-12-16 2008-12-30 08:53
 
190 Talk FixLine 테스트버전 081215 [1] file 그레이 20429   2008-12-16 2008-12-16 16:37