エンコーディング判別・変換ライブラリ「バベル」の使い方。

第12回デベロッパーキャンプでネタにしたmlang.dllのDetectInputCodepageがBOM無しUTF-8をWindows-1252と誤判別するので、代替としてバベルを使ってみる。

使い方はヘッダファイルbabel.hをインクルードして、プロジェクトにbabel.cppを追加するだけ。

以下はコード例。

//---------------------------------------------------------------------------
#include <iostream>
#include <fstream>
#include <iterator>
#include <string>
#pragma hdrstop

#include "babel/babel.h"
#include <tchar.h>
//---------------------------------------------------------------------------

#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
  using namespace std;

  // バベルの初期化(必須)
  babel::init_babel();

  ifstream ifs("CJK.txt");

  // スペースや改行をスキップしない
  ifs >> noskipws;

  // ファイルの中身を全部読み込む
  istream_iterator<char> ifsiter(ifs), eof;
  string buffer(ifsiter, eof);

  // エンコーディングの判別
  babel::analyze_result result(babel::analyze_base_encoding(buffer));

  // エンコーディング名取得
  string EncodingName = babel::profile_for_UI::get_base_encoding_name(result);
  cout << "Engoding : " << EncodingName << endl;

  // エンコーディングを自動判別してUTF-16へ変換する
  wstring UTF16String =  babel::auto_translate<wstring>(buffer, babel::base_encoding::utf16);

  // エンコーディングを自動判別してデフォルトのエンコーディング(WindowsならばShift-JIS)に変換する
  string SjisString =  babel::auto_translate<>(buffer);

  return 0;
}
//---------------------------------------------------------------------------

関数init_babelでバベルを初期化。
文字コードの変換はauto_translateで自動的に行う。デフォルトはシングルバイト文字列だけど、ワイド文字列に変換したい場合はパラメータにwstringとbase_encoding::utf16を渡せばOK。

11/01/28 追記:
コマンドライン(bcc32.exe)からコンパイルするのではなく、C++Builder XEからプロジェクトに組み込んでコンパイルする場合、メモリ不足などの理由でコンパイルが失敗する場合がある。その場合は、プロジェクトオプションの[C++|拡張|コンパイラに渡す追加オプション]に"--savemem=140"を追加するとうまくいく場合がある。それでも駄目な場合はコマンドラインからコンパイルして、「#pragma link "babel.obj"」をソースコードのどこか(メインフォームの.cppがベスト)に記述するのが吉。