2008/01/24

VCL C++ ASCII 텍스트 파일을 UNICODE 텍스트 파일로 변환

UNICODE 의 종류가 여러가지 인데 이 코드는 윈도우에서 주소 사용하는 방식인 16bit Little Edian 방식으로 변환한다.
옵션으로 소스가 UNICODE 일때는 그냥 복사 한다.
UNICODE 종류별 변환은 나중에 구현해 봐야겠다.

int __fastcall TfrmMain::Asc2Uni(String strSrc, String strDst,
bool bCopyIfUniSrc /*= true*/)
{
int ErrorCode = 0;

TFileStream* pSrcStream = new TFileStream(strSrc, fmOpenRead);
TFileStream* pDstStream = new TFileStream(strDst, fmCreate);

TStringList* pSlstSrc = new TStringList();
pSlstSrc->LoadFromStream(pSrcStream);

if (pSrcStream != NULL && pDstStream != NULL)
{
WideString wString;

// Check BOM
unsigned char BOM[4];
memcpy(BOM, pSlstSrc->Strings[0].c_str(), 4);

bool b32BE = (BOM[0] == 0x00 && BOM[1] == 0x00 &&
BOM[2] == 0xFE && BOM[3] == 0xFF);
bool b32LE = (BOM[0] == 0xFF && BOM[1] == 0xFE &&
BOM[2] == 0x00 && BOM[3] == 0x00);
bool b16BE = (BOM[0] == 0xFE && BOM[1] == 0xFF);
bool b16LE = (BOM[0] == 0xFF && BOM[1] == 0xFE);
bool bU8 = (BOM[0] == 0xEF && BOM[1] == 0xBB &&
BOM[2] == 0xBF);

if (b32BE) ErrorCode = -1;
if (b32LE) ErrorCode = -2;
if (b16BE) ErrorCode = -3;
if (b16LE) ErrorCode = -4;
if (bU8) ErrorCode = -5;

if (ErrorCode == 0)
{
// Write Unicode BOM
BOM[0] = 0xFF;
BOM[1] = 0xFE;
pDstStream->Write((void*)BOM, 2);

for (int row = 0; row < pSlstSrc->Count; ++row)
{
wString = WideString(pSlstSrc->Strings[row] + "
\n");

pDstStream->Write((void*)wString.c_bstr(),
wString.Length() * sizeof(wchar_t));
}
}
}

delete pSrcStream;
delete pDstStream;
delete pSlstSrc;

if (ErrorCode != 0 && bCopyIfUniSrc)
{
//ShowMessage("DirectCopy");
CopyFile(strSrc.c_str(), strDst.c_str(), false);
}

return ErrorCode;
}

Original Post : http://neodreamer-dev.tistory.com/50

No comments :

Post a Comment