2008/01/24
VCL C++ ASCII 텍스트 파일을 UNICODE 텍스트 파일로 변환
UNICODE 의 종류가 여러가지 인데 이 코드는 윈도우에서 주소 사용하는 방식인 16bit Little Edian 방식으로 변환한다.
옵션으로 소스가 UNICODE 일때는 그냥 복사 한다.
UNICODE 종류별 변환은 나중에 구현해 봐야겠다.
옵션으로 소스가 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
Labels:
C++
,
C++ Builder
,
Little Edian
,
TistoryOldPost
,
Turbo C++
,
UNICODE
,
VCL
Subscribe to:
Post Comments
(
Atom
)
No comments :
Post a Comment