IMultiLanguage2::DetectInputCodepageを使う方法と、EncodeDetectユニットを使う方法を紹介します。
文字コードを判別するには、IMultiLanguage2::DetectInputCodepageを使用します。
IMultiLanguage2::DetectInputCodepage()は、Internet Explorer 5以降がインストールされていれば使用できます。
IMultiLanguage2::DetectInputCodepage()を使用するには、mlang.hが必要です。
#include <mlang.h>
プログラムの実行時にCoInitialize()を、終了時にCoUninitialize()を実行します。
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
CoInitialize(NULL);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
CoUninitialize();
}
判別処理です。
Edit1(一行入力欄)に文字コードを判別するファイルのファイル名が入っています。
ファイルをTStringListで読み込みます。
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//ファイルの読み込み
std::unique_ptr<TStringList> file(new TStringList());
file->LoadFromFile(Edit1->Text);
int src_size = file->Text.Length();
IMultiLanguage2のインスタンスを作成します。
//IMultiLanguage2のインスタンスの作成
IMultiLanguage2* mlang = NULL;
HRESULT result = CoCreateInstance(CLSID_CMultiLanguage,
NULL,
CLSCTX_INPROC_SERVER,
IID_IMultiLanguage2,
(void**)&mlang);
if (FAILED(result))
{
return;
}
scoresで取得する文字コードの候補の数を指定します。
DetectInputCodepage()では、文字コードの候補とその確かさを取得できます。
返値がS_OKでなければ、判別に失敗です。
//文字コードを判別する
int scores = 10; //取得する候補の数
DetectEncodingInfo encoding[10];
if (S_OK != mlang->DetectInputCodepage(MLDETECTCP_NONE,
0,
file->Text.c_str(),
&src_size,
encoding,
&scores)) {
mlang->Release();
return;
}
判別結果をメッセージボックスに表示します。
//encodingに候補が入る
AnsiString mes;
for (int i = 0; i < scores; ++i)
{
if (encoding[i].nLangID != 0)
{
mes.sprintf("CodePage=%d,DocPercen=%d", encoding[i].nCodePage, encoding[i].nDocPercent);
MessageDlg(mes, mtWarning, TMsgDlgButtons() << mbOK, 0);
}
}
文字コードは、コードページで返されます。
コードページについては、以下のページが詳しいです。
最後にメモリを解放します。
mlang->Release();
EncodeDetectは、EncodeDetect.pasをプロジェクトに追加するだけで手軽に使うことができます。
EncodeDetectは次のページからダウンロードできます。
ダウンロードしたファイルを展開し、EncodeDetect.pasをプロジェクトに追加します。
プロジェクトを再構築すると、EncodeDetect.hppが作成されます。
作成されたEncodeDetect.hppをincludeします。
#include "EncodeDetect.hpp"
文字コードを判別するにはEncodedetect::CheckEncoding関数を使用します。
RawByteString s = … //判別したいバイト列
unique_ptr<TMemoryStream> ms(new TMemoryStream());
ms->Write(s.c_str(), s.Length());
int encoding = Encodedetect::CheckEncoding(ms);
戻り値は判別された文字コードです。
詳細は、Encodedetect::CheckEncoding関数をご覧ください。