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] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||