390 likes | 518 Views
マスタリング バベル. Boost. 勉強会 #2 ( 2010-09-11 ). 概要. バベルってなに? 使い方 オプション 今後 の課題. バベルってなに?. マスタリング バベル. バベルってなに?. 文字エンコーディング変換モジュールです!. バベルってなに?. 文字エンコーディング変換モジュールです! シフト JIS,JIS,EUC,UNICODE(UTF-8,UTF-16,UTF-32) に対応していずれの組み合わせであろうと相互変換できます。. バベルってなに?. 文字エンコーディング変換モジュールです!
E N D
マスタリング バベル Boost.勉強会 #2 ( 2010-09-11 )
概要 • バベルってなに? • 使い方 • オプション • 今後の課題
バベルってなに? マスタリング バベル
バベルってなに? • 文字エンコーディング変換モジュールです!
バベルってなに? • 文字エンコーディング変換モジュールです! • シフトJIS,JIS,EUC,UNICODE(UTF-8,UTF-16,UTF-32)に対応していずれの組み合わせであろうと相互変換できます。
バベルってなに? • 文字エンコーディング変換モジュールです! • シフトJIS,JIS,EUC,UNICODE(UTF-8,UTF-16,UTF-32)に対応していずれの組み合わせであろうと相互変換できます。 • ×国際化対応の為のものではありません! • 国際化対応を前提とする場合、MLang, iconv, ICU あたりを推奨します。
バベルってなに? • 真にフリーなライセンス
バベルってなに? • 真にフリーなライセンス • GPLみたいにうだうだ言いません!
バベルってなに? • 真にフリーなライセンス • GPLみたいにうだうだ言いません! • 商用だろうが断りなく好き勝手に使って構いません!
バベルってなに? • 真にフリーなライセンス • GPLみたいにうだうだ言いません! • 商用だろうが断りなく好き勝手に使って構いません! • オープンソースソフトウェアの一部としてソースファイル毎再配布しても構いません!
バベルってなに? • 強いて制限を挙げるなら…
バベルってなに? • 強いて制限を挙げるなら… • 「バベルはワシが作った」とか言い出さないで。 • 第三者から俺が盗人呼ばわりされるのはさすがに勘弁!
バベルってなに? • 強いて制限を挙げるなら… • 「バベルはワシが作った」とか言い出さないで。 • 第三者から俺が盗人呼ばわりされるのはさすがに勘弁! • 万が一なにか問題があっても「自己責任」で。 • 俺に責任追及されてもそんなの知らん!
バベルってなに? • 高い文字エンコーディング判別精度
バベルってなに? • 高い文字エンコーディング判別精度 • 日本語限定だし、日本語文中に含まれる文字コードの出現率データを使っているので非常に高い文字エンコーディング判別精度を誇ります!
バベルってなに? • 高い移植性
バベルってなに? • 高い移植性 • あの AIX 上ですらちゃんと動きます! • ※ここ苦笑する所
バベルってなに? • 利用実績
バベルってなに? • 利用実績 • 具体的な数は残念ながらろくに把握できていませんが、フリーなライセンス、文字エンコーディング判別精度、高い移植性なんかのおかげで、かなり規模でご採用頂けているようです。
使い方 マスタリング バベル
使い方 • まずバベルをここからダウンロードします! • http://tricklib.com/cxx/ex/babel/#download • ※一番下の[バベル全ファイルZIPパック]がオススメ
使い方 • 次にダウンロードした各ファイルをバベルを利用するプログラムのソースファイルを置いているディレクトリにコピーします。 • ※babel.hと babel.cpp だけでなく*.csv, *.dat も同じディレクトリに一緒にコピーしてください。
使い方 • babel.hを #include します。 #include "babel.h"
使い方 • 最初に初期化関数を呼び出します。 int main(...) { ... babel::init_babel(); ... }
使い方 • 文字エンコーディング変換関数を呼び出します。 void f() { std::string source, destination; ... // 全自動変換 destination = babel::auto_translate<>(source); ... // ShiftJIS→EUC変換 destination = babel::sjis_to_euc(source); } 変換関数の一覧:http://tricklib.com/cxx/ex/babel/#functions
使い方 • あとは babel.cpp も他のソースコードと一緒にコンパイル・リンクもするだけ。 • ※具体的な方法はご使用のIDEやmakeなどの環境次第ですのでここでは説明しません。
使い方 • ストリーム using namespace babel; void execute_translater(std::istream &input, std::ostream &output, bbl_translater<bbl_binary, bbl_binary> translater) { bbl_binarybuffer; bbl_binarybuffer2; while(!input.eof()) { bbl_binary::value_type buffer3[1024]; input.read(buffer3, 1024); unsigned int size = input.gcount(); buffer.assign(buffer3, size); translater<< buffer; translater>> buffer2; output << buffer2; } } void f() { … execute_translater(std::ifstream(“src.txt”), std::cout, auto_translate_engine<bbl_string>::create()); … }
オプション マスタリング バベル
オプション • 大半のマクロ定義によるオプションは指定なしでもだいたいよしなに処理しますが多少効率の悪いコードになることもあるので面倒でなければ指定をしたほうがいいです。
オプション • wchar_tのサイズ • __UNICODE_CHAR_SIZE_2__ • __UNICODE_CHAR_SIZE_4__ • × __UNICODE_CHAR_SIZE_UNKNOWN__
オプション • エンディアン • __LITTLE_ENDIAN_COMPUTER__ • __BIG_ENDIAN_COMPUTER__ • × __UNKNOWN_ENDIAN_COMPUTER__
オプション • 処理系(コンパイラ)の文字エンコーディング • __USING_ANSI__ • __USING_SJIS__ • __USING_EUC__ • __USING_UTF8__ • × __USING_UNKNOWN__
オプション • テーブルの形式 • __BBL_USING_STATIC_TABLE__ ( default ) • 静的なテーブルを使用し、 babel::init_babel() の処理時間も非常に短くなります。 • コンパイラに負荷をかける為、コンパイルできないことがあります。 • ※コンパイラのオプションで問題を回避できる場合もあり。 • __BBL_USING_STDMAP_TABLE__ • 静的なテーブルの代りに std::map を使用し、 babel::init_babel() の処理時間も長くなり、メモリ消費量も増大します。
オプション • SJIS⇔UNICODE変換で使用するマッピング • __BBL_USE_UNICODE_MAP_CP932__ ( default ) • __BBL_USE_UNICODE_MAP_UTC__ • __BBL_USE_UNICODE_MAP_APPLE__
オプション • 使用しないコードとデータの除去 • __BBL_DISABLE_UNICODE__ • __BBL_DISABLE_BINARY__ • __BBL_DISABLE_UTF32__ • ※この指定だけは babel.hで始めから固定で定義されています。 UTF-32 の実装が必要な場合にこのマクロの #define を babel.hから削除してください。 • __BBL_DISABLE_SELECTORS__
今後の課題 マスタリング バベル
今後の課題 • マクロ名から連続したアンダースコアの除去 • 例: __BABEL_BABEL_H__ → BABEL_BABEL_H • UTF-8 で本来無効なバイト列の無効化 • 絵文字対応
質疑応答 マスタリング バベル
ご静聴ありがとうございました。 マスタリング バベル