エンコーディング判別・変換ライブラリ「バベル」の使い方。
第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がベスト)に記述するのが吉。