Top / Programming / C++Builder / 文字コードを判別する

文字コードを判別する

IMultiLanguage2::DetectInputCodepageを使う方法と、EncodeDetectユニットを使う方法を紹介します。

IMultiLanguage2::DetectInputCodepage

文字コードを判別するには、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は、EncodeDetect.pasをプロジェクトに追加するだけで手軽に使うことができます。

  1. EncodeDetectは次のページからダウンロードできます。

    EncodeDetect : EncodeDetectリファレンス - Delphi 2009 特集

  2. ダウンロードしたファイルを展開し、EncodeDetect.pasをプロジェクトに追加します。

  3. プロジェクトを再構築すると、EncodeDetect.hppが作成されます。

  4. 作成された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関数をご覧ください。