cb024 「UTF-8 ANSI 文字コード変換」(04/11/13 Sat)

 

← 戻る C++ Builderメニュー 次へ → ☆ Top ☆

 

バイナリファイル(中身はUTF-8のテキスト)をANSI文字コードのテキストファイルに変換します。

これは、極限られた使い方しかできないと思いますが、一応書いておきます。

注意(UTF-8には、色々あるそうで、ファイルによっては、うまく機能しないと思います)

まず、準備が必要です。

#include <stdio.h> //ファイル関係

をcppファイルの先頭に。

extern PACKAGE AnsiString __fastcall WideCharToString(wchar_t * Source);
extern PACKAGE AnsiString __fastcall AdjustLineBreaks(const AnsiString S, System::TTextLineBreakStyle Style = tlbsCRLF);

をh(ヘッダ)ファイルのexternに。

☆バイナリファイル(中身はUTF-8のテキスト)をANSI文字コードのテキストファイルに☆

void __fastcall TForm1::Button1Click(TObject *Sender)
{
//ファイルパスを指定
AnsiString AppPath;
AppPath = ExtractFilePath(Application->ExeName) + "FC2LOG.txt";
//ファイルの準備
FILE *Tfp;
//ファイルを読み込みバイナリで開く
Tfp = fopen(AppPath.c_str(), "rb");
//バッファを用意
char * lpBuff = NULL; //LPSTR lpBuff = NULL;でも一緒
//サイズ確認
int StrCode;
int StrSize;
while ( !feof(Tfp) ) {
StrCode = fgetc(Tfp);
StrSize++;
}
Label1->Caption =(IntToStr(StrSize)); //サイズは○バイト
//ファイルの最初に戻しとく
rewind(Tfp);
//バイナリをバッファに(領域確保しつつ)
lpBuff = (char*)calloc( StrSize, sizeof(char) );
fread( lpBuff, StrSize, sizeof(char), Tfp);
//ファイル閉じる
fclose(Tfp);
//バッファをUnicodeに変換
int UniLeng;
wchar_t * UniBuff= NULL;
//Unicoedに変換した時の長さを調べ、
UniLeng = MultiByteToWideChar(CP_UTF8, 0, lpBuff, -1,NULL, 0 );
//その分領域確保し、
UniBuff = (wchar_t*)calloc( UniLeng, sizeof(wchar_t) );
//変換実行する。
MultiByteToWideChar(CP_UTF8, 0, lpBuff, -1,UniBuff, UniLeng );
//UnicodeをANSI文字に
AnsiString StrRes;
StrRes = System::WideCharToString(UniBuff);
//一応メモに表示させて保存。
Memo1->Text = Sysutils::AdjustLineBreaks(StrRes);
Memo1->Lines->SaveToFile("SAVE.txt");
//バッファ開放
free(lpBuff);
free(UniBuff);

}

だー!なんか長い!とりあえずフォームでは、ボタンとLabelとMemoしか使ってません。

あとはまぁコード内にコメント書いたんで。

あと、↑のコードは、本当に最小限です。エラー出たら・・・とか一切考えてません^^;

あくまで「↑のようにやれば良い!」じゃなくて、「↑のようにやったらいけた・・・」です。

しかもバイナリでやってますんで、最初からUTF-8の文字列があるならもっと簡単かも?

 

あと、関係あるかハッキリしませんが、MemoのWordWrapをfalseにしてます。

 

← 戻る C++ Builderメニュー 次へ → ☆ Top ☆

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送