글 수 429
텍스트파일을
특정 인코딩에 따라서 읽거나 쓰는 라이브러리 되겠습니다.
파일에 BOM이 설정되어 있는 경우에는
nUnicode값에 상관없이 (MBCS일지라도!)
BOM에 맞는 값을 읽어옵니다.
vector를 이용한 함수를 사용할 경우
'줄 단위'로 잘라져서 들어갑니다.
사용법
참고1.
FileOpen할때 인코딩 지정은
BOM이 없는 파일을 기준으로 해주는것이 좋습니다.
예를 들자면
'UTF16LE_NOBOM'
'MBCS,949'
참고2.
FileOpen에서 vector를 사용하는 함수값의
반환값이 LPWSTR이긴 하지만,
이 경우에는 무조건 NULL이 반환됩니다.
오버로딩 때문에 적용된 '꼼수'일 뿐이니 실수하지 않도록 해주세요 ^^;
참고3.
Visual Studio 2005에서 작성하였지만
라이브러리 파일 자체는 어느 버전에서든 잘 작동할거라고 봅니다
특정 인코딩에 따라서 읽거나 쓰는 라이브러리 되겠습니다.
#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에서 작성하였지만
라이브러리 파일 자체는 어느 버전에서든 잘 작동할거라고 봅니다
HaruKaze
- 2009.02.08
- 17:58:08
유니코드 파일을 오픈 할 경우 라인이 한줄씩 더 생기는 문제가 발생하네요..ㅠ.ㅠ
그리고 건의드리고 싶은게 nUnicode를 인자로 주고 받을것이 아니라 코드페이지를 참조해서 수행하면 좋을것 같아요. 단 유니코드일 경우에는 반드시 BOM 첨가로...
저장쪽은 일단 난잡하게 수정해서 해결은 했는데 오픈쪽은 손을 못대겠어요...ㄷㄷ
일단 수정한 부분은 다음...
그리고 건의드리고 싶은게 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); } }