TrickLibrary
  1. http://tricklib.com/
  2. cxx/
  3. ex/
  4. babel/

バベル -babel-

about バベル

バベルは各種文字コード... シフトJIS, JIS, EUC, UNICODE(UTF8, UTF16, UTF32) ...を変換するモジュールです。
バベルでの変換は特に明記していない限り MS-Windows の IE をお手本にしています。

...こーゆー機能が欲しいとか、ここはこーした方がなどなどのご指摘があれば道化師までメールにてお伝えくださいまし。

Wraith the Trickster

以前は異なるマッピングを用いてシフトJIS(例:"―〜‖−¢£¬")からUNICODE(例:"—〜‖−¢£¬")に変換されたようなテキストを、バベルでシフトJISに戻そうとして綺麗に戻せませんでした。 これは使用しているマッピングが違う以上仕方がないことではあるのですが、実用上そこそこの頻度で遭遇する事態であり、またエンドユーザからして見ればそんなシステム上の都合なんて知ったこっちゃない話なんで、基本的に対応していくことに路線変更しました。 対応することで極端に文字コードの変換速度が落ちるとか、変換に矛盾が生じるとかいった類のものでなければ対応していきますので、バベルを使用しても綺麗変換できない文字コードに遭遇された場合は是非とも道化師までご連絡ください。

2011-03-01 Boost.勉強会 #2 ( 2010-09-11 )で発表したマスタリング バベルの ustream へのリンクと発表資料の追加。

使用方法

下のリンクから全ファイルをダウンロード( babel.lzh(433KB) あるいは babel.zip(468KB) でまとめてダウンロードすることをオススメします。 )して、バベルを使用したいモジュール内で babel.h をインクルードし、babel.cpp をコンパイル&リンクするだけです。( *.csv および *.dat は babel.cpp 内でインクルードされます。) お手軽に組み込みたい場合は、babel.h の代わりに babel.cpp をインクルードするのもありです。(リンクする翻訳単位が複数ある場合、babel.cppをインクルードするのは全体で一度だけにしてください。)

ダウンロード

バベル本体 全ファイルパック

マスタリング バベル

2010-09-11 に行われたBoost.勉強会 #2で発表したマスタリング バベルの ustream へのリンクと発表資料です。

使用例

■バベルモジュールの初期化
#include "babel.h"

int main(...) {
	...
	babel::init_babel();
	...
}

■全自動変換
#include "babel.h"

void f() {
	std::string source, destination;
	...
	destination = babel::auto_translate<>(source);
	...
}

■ShiftJIS→EUC変換
#include "babel.h"

void f() {
	std::string source, destination;
	...
	destination = babel::sjis_to_euc(source);
	...
}

リファレンス

以下、編集中

macro

マクロは特に何も定義しなくとも正常に動くように設計はしていますが、環境に合わせて適宜指定やるとコード上に無駄がなくなります。また、バベルはフル装備にするとサイズ的にかなり重くなりますので、不要な部分の実装は __BBL_DISABLE_*__ で拒否してください。(コンパイラの最適化(ってゆーより、リンカか)がしっかり働いていればその必要はないかもしれませんが。)
Wraith the Trickster

マクロの指定が面倒な場合は、babel.h 内で指定が楽なように予めコメントアウトした状態でマクロが記述されていますので、コメント記号を外して有効にしてください。記述されている箇所は「☆」で検索してください。

マクロ名種別説明
__BABEL_BABEL_H__自動定義babel.h の重複インクルード対策の為に使用されています。
__WITH_BABEL__ユーザ定義/自動定義バベル以外のモジュールに対しバベルが組み込まれていることを示す為に使用されます。バベルに対応しているモジュールを組み込む際にはこのマクロを定義することで、バベルと連携させてください。
__UNICODE_CHAR_SIZE_2__ユーザ定義sizeof(wchar_t) == 2 となる処理系ではこのマクロを定義してください。定義しなくてもバベルは自動判別を行いますが、判別の為の余分なコードが生成される可能性があります。
__UNICODE_CHAR_SIZE_4__ユーザ定義sizeof(wchar_t) == 4 となる処理系ではこのマクロを定義してください。定義しなくてもバベルは自動判別を行いますが、判別の為の余分なコードが生成される可能性があります。
__UNICODE_CHAR_SIZE_UNKNOWN__自動定義__UNICODE_CHAR_SIZE_2__ も __UNICODE_CHAR_SIZE_4__ も定義されなかった際に自動定義されます。
__LITTLE_ENDIAN_COMPUTER__ユーザ定義リトルエンディアンの環境下で使用する場合はこのマクロを定義してください。定義しなくてもバベルは自動判別を行いますが、判別の為の余分なコードが生成される可能性があります。
__BIG_ENDIAN_COMPUTER__ユーザ定義ビッグエンディアンの環境下で使用する場合はこのマクロを定義してください。定義しなくてもバベルは自動判別を行いますが、判別の為の余分なコードが生成される可能性があります。
__UNKNOWN_ENDIAN_COMPUTER__自動定義__LITTLE_ENDIAN_COMPUTER__ も __BIG_ENDIAN_COMPUTER__ も定義されなかった際に自動定義されます。
__USING_ANSI__ユーザ定義処理系が日本語に対応していない場合にこのマクロを定義してください。定義しなくてもバベルは自動判別を行いますが、判別の為の余分なコードが生成される可能性とベースエンコーディングを誤認する危険性があります。...ただし、実際には日本語に対応していない処理系ではバベルをまともにコンパイルすることはできないでしょう。
__USING_SJIS__ユーザ定義処理系が Shift_JIS ベースの場合にこのマクロを定義してください。定義しなくてもバベルは自動判別を行いますが、判別の為の余分なコードが生成される可能性とベースエンコーディングを誤認する危険性があります。
__USING_EUC__ユーザ定義処理系が EUC-JP ベースの場合にこのマクロを定義してください。また、その際には Shift_JIS のテキストである babel.cpp 及び babel.h を予め EUC-JP のテキストに変換しておいてください。このマクロを定義しなくてもバベルは自動判別を行いますが、判別の為の余分なコードが生成される可能性とベースエンコーディングを誤認する危険性があります。
__USING_UTF8__ユーザ定義処理系が UTF-8 ベースの場合(って、そんな処理系あんのか?)にこのマクロを定義してください。また、その際には Shift_JIS のテキストである babel.cpp 及び babel.h を予め UTF-8 のテキストに変換しておいてください。このマクロを定義しなくてもバベルは自動判別を行いますが、判別の為の余分なコードが生成される可能性とベースエンコーディングを誤認する危険性があります。
__USING_UNKNOWN__自動定義__USING_ANSI__, __USING_SJIS__, __USING_EUC__, __USING_UTF8__ のいずれも定義されなかった際に自動定義されます。
__BBL_STRING_DEFAULT__ユーザ定義/自動定義このマクロが定義されると、文字列型をテンプレート引数とするテンプレートのデフォルトに babel::bbl_string が設定されます。__BBL_STRING_DEFAULT__ も __BBL_WSTRING_DEFAULT__ も定義されていなければ自動的に __BBL_STRING_DEFAULT__ が定義されます。
__BBL_WSTRING_DEFAULT__ユーザ定義このマクロが定義されると、文字列型をテンプレート引数とするテンプレートのデフォルトに babel::bbl_wstring が設定されます。__BBL_STRING_DEFAULT__ も __BBL_WSTRING_DEFAULT__ も定義されていなければ自動的に __BBL_STRING_DEFAULT__ が定義されます。
__BBL_USING_STATIC_TABLE__ユーザ定義/自動定義このマクロが定義されると、各種マッピング(一部除く)を静的なテーブルで実装します。静的なテーブルを使用することで初期化の手間が省け babel::init_babel() の処理時間が非常に短くなりますが、コンパイラに負荷をかけるためコンパイラによっては正しく処理することができないかもしれません。コンパイルが通らない場合は、 __BBL_USING_STDMAP_TABLE__ を試して見て下さい。__BBL_USING_STATIC_TABLE__ も __BBL_USING_STDMAP_TABLE__ も定義されていなければ自動的に __BBL_USING_STATIC_TABLE__ が定義されます。
__BBL_USING_STDMAP_TABLE__ユーザ定義このマクロが定義されると、全マッピングを std::map で実装します。std::map にデータをロードする必要がある為 babel::init_babel() の処理時間が長くなり実行中のメモリ消費も __BBL_USING_STATIC_TABLE__ に比べかなり大きくなります。__BBL_USING_STATIC_TABLE__ も __BBL_USING_STDMAP_TABLE__ も定義されていなければ自動的に __BBL_USING_STATIC_TABLE__ が定義されます。
__BBL_STRICT_TRANSLATE__ユーザ定義このマクロが定義されると、EUC 及び JIS から SJIS への変換を UNICODE を経由して行います。UNICODE を経由することにより SJIS でも表現可能な一部の補助漢字を正しくマッピングします。ただし、UNICODE を経由する分処理速度は落ちます。
__BBL_LOAD_UNICODE_MAP_CP932__ユーザ定義/自動定義このマクロが定義されていると CP932 のマッピングを使用した SJIS⇔UNICODE 処理を実装します。 __BBL_USE_UNICODE_MAP_CP932__ が定義されている場合、このマクロは自動定義されます。
__BBL_LOAD_UNICODE_MAP_UTC__ユーザ定義/自動定義このマクロが定義されていると UTC のマッピングを使用した SJIS⇔UNICODE 処理を実装します。 __BBL_USE_UNICODE_MAP_UTC__ が定義されている場合、このマクロは自動定義されます。
__BBL_LOAD_UNICODE_MAP_APPLE__ユーザ定義/自動定義このマクロが定義されていると APPLE のマッピングを使用した SJIS⇔UNICODE 処理を実装します。 __BBL_USE_UNICODE_MAP_APPLE__ が定義されている場合、このマクロは自動定義されます。
__BBL_USE_UNICODE_MAP_CP932__ユーザ定義/自動定義このマクロが定義されているとデフォルトの SJIS⇔UNICODE 変換処理として CP932 のマッピングを使用した処理が設定されます。__BBL_USE_UNICODE_MAP_CP932__, __BBL_USE_UNICODE_MAP_UTC__, __BBL_USE_UNICODE_MAP_APPLE__ のいずれも定義されていない場合、このマクロが自動定義されます。
__BBL_USE_UNICODE_MAP_UTC__ユーザ定義このマクロが定義されているとデフォルトの SJIS⇔UNICODE 変換処理として UTC のマッピングを使用した処理が設定されます。
__BBL_USE_UNICODE_MAP_APPLE__ユーザ定義このマクロが定義されているとデフォルトの SJIS⇔UNICODE 変換処理として APPLE のマッピングを使用した処理が設定されます。
__BBL_DISABLE_UNICODE__ユーザ定義UNICODE 関連の実装を拒否したい場合にこのマクロを定義してください。
__BBL_DISABLE_BINARY__ユーザ定義/自動定義UTF-16, UTF-32 入出力関連の実装を拒否したい場合にこのマクロを定義してください。__BBL_DISABLE_UNICODE__ が定義された場合、このマクロは自動定義されます。
__BBL_DISABLE_UTF32__ユーザ定義/自動定義UTF-32 関連の実装を拒否したい場合にこのマクロを定義してください。__BBL_DISABLE_UNICODE__ あるいは __BBL_DISABLE_BINARY__ が定義された場合、このマクロは自動定義されます。現状では UTF-32 に対応しているソフトを見かけないので実装しても蛇足になるだけだと思われるので、実際にはデフォルトで babel.h にて定義しています。UTF-32 に対応させたい場合はその定義をコメントアウトしてください。
__BBL_DISABLE_SELECTORS__ユーザ定義/自動定義translate_to_string-, auto_translate-, translate_to_binary-, manual_translate- ... 以上のクラス、関数の実装を拒否したい場合にこのマクロを定義してください。
__BBL_USE_UNICODE__自動定義__BBL_DISABLE_UNICODE__ が定義されなかった場合に自動定義されます。
__BBL_USE_BINARY__自動定義__BBL_DISABLE_BINARY__ が定義されなかった場合に自動定義されます。
__BBL_USE_UTF32__自動定義__BBL_DISABLE_UTF32__ が定義されなかった場合に自動定義されます。
__BBL_USE_SELECTORS__自動定義__BBL_DISABLE_SELECTORS__ が定義されなかった場合に自動定義されます。

enums

babel::base_encoding
型名説明
babel::base_encoding::unknown不明なエンコーディング。
babel::base_encoding::ansiANSI。
babel::base_encoding::sjisシフトJIS。
babel::base_encoding::jisJIS(半角カナ可)。
babel::base_encoding::eucEUC。
babel::base_encoding::iso2022jpISO-2022-JP。
babel::base_encoding::utf8UTF-8。
babel::base_encoding::utf16beUTF-16BE。
babel::base_encoding::utf16leUTF-16LE。
babel::base_encoding::utf32beUTF-32BE。
babel::base_encoding::utf32leUTF-32LE。
babel::base_encoding::unicodeUNICODE。バイナリ出力のエンコーディングとしてこの値が指定された場合は、UTF-16BE, UTF-16LE, UTF-32BE, UTF-32LE の中から環境に応じてもっとも処理コストの低いエンコーディングで出力されます。
babel::base_encoding::utf16UTF-16。バイナリ出力のエンコーディングとしてこの値が指定された場合は、UTF-16BE, UTF-16LE の中から環境に応じてもっとも処理コストの低いエンコーディングで出力されます。
babel::base_encoding::utf32UTF-32。バイナリ出力のエンコーディングとしてこの値が指定された場合は、UTF-32BE, UTF-32LE の中から環境に応じてもっとも処理コストの低いエンコーディングで出力されます。。

base types

型名元型説明
babel::bbl_binarystd::stringバイナリデータを扱うのに使用されます。この型は std::string のエイリアスとして定義されています。
babel::bbl_stringstd::stringchar ベースの文字列を扱うのに使用されます。この型は std::string のエイリアスとして定義されています。この型で扱われるのは UNICODE 以外の文字列と UTF-8 文字列です。
babel::bbl_wstringstd::wstringwchar_t ベースの文字列を扱うのに使用されます。この型は std::wstring のエイリアスとして定義されています。この型で扱われるのは UNICODE 文字列のみです。

base layer classes

以下はバベルの基本となるクラスの説明となります。バベルを深く利用する助けにはなるでしょうが、必ずしも知っておく必要はありません。
クラス名親クラス説明
babel::bbl_demi-クラス化関数基本クラステンプレートとして使用しています。関数テンプレートではデフォルトのテンプレート引数を設定できないので、用途としては関数テンプレートなのですがクラステンプレートにすることでデフォルトのテンプレート引数の設定を可能にしています。
cf. http://www.tietew.jp/cppll/archive/67, http://www.tietew.jp/cppll/archive/167
babel::bbl_smart_base-バベルで使用されているスマートポインタの Body 側の基本クラスです。
babel::bbl_smart_shell-バベルで使用されているスマートポインタの Handle 側の基本クラスです。
babel::bbl_translate_enginebabel::bbl_smart_base各種変換処理が実装されているクラスの親クラスです。
babel::dull_enginebabel::bbl_translate_engineなにも変換処理を行わないトランスレータエンジンです。babel::through_engine と違いなにも変換結果を返しません。
babel::through_enginebabel::bbl_translate_engineなにも変換処理を行わないトランスレータエンジンです。babel::dull_engine と違い変換元文字列をそのまま変換結果として返します。
babel::twin_translate_enginebabel::bbl_translate_engine二つのトランスレータエンジンを合成し、一つのトランスレータエンジンにするクラステンプレートです。
babel::bbl_translater-トランスレータエンジンの器です。各トランスレータエンジンのスタティックメンバ関数を除くデータメンバ及びメンバ関数は全てこのクラスを通して行うことになります。

worker classes

トランスレータエンジン( babel::bbl_translate_engine を継承するクラス )のメンバ関数
メンバ名種別説明
create静的メンバ関数クラスのインスタンスを作成します。トランスレータエンジンのオブジェクトはこの関数で取得してください。なお、トランスレータエンジンのオブジェクトは裸で晒されることはなく、実際には babel::bbl_translate でラップされた状態で返されます。
ignite静的メンバ関数(スタック上にクラスのインスタンスを作成し)変換処理を実行します。単発の変換処理を行う場合にはこの関数をご利用ください。ヒープにクラスのインスタンスを作成せず(とは言っても、内部で使用している文字列クラスがヒープを利用するでしょうが)、スマートポインタの処理も省かれるので若干速度的に優れます。
translate仮想メンバ関数基本的にこのメンバ関数が babel::bbl_translate クラス以外から直接呼び出されることはありません。このメンバ関数が実際に変換処理を行う関数となります。
flush仮想メンバ関数基本的にこのメンバ関数が babel::bbl_translate クラス以外から直接呼び出されることはありません。このメンバ関数は traslate メンバ関数の補助的な立場の関数で、traslate メンバ関数が(続きのデータが送られるまで)処理を保留しているデータを強制的に処理します。(多くは無効な文字として処理されることになります。)
clear仮想メンバ関数基本的にこのメンバ関数が babel::bbl_translate クラス以外から直接呼び出されることはありません。このメンバ関数は変換元バッファと変換済バッファを初期化します。

babel::bbl_translate クラスのメンバ関数
メンバ名種別説明
translateメンバ関数トランスレータエンジンの変換元バッファにデータをセットし、トランスレータエンジンの translate メンバ関数を呼び出します。
flushメンバ関数トランスレータエンジンの flush メンバ関数を呼び出します。
clearメンバ関数トランスレータエンジンの clear メンバ関数を呼び出します。
...babel::bbl_translate クラスには他にも使い勝手がいいように上記メンバ関数をラップしているメンバ関数群があります。詳細は babel.h 内の実装を参照してください。( ...「実装を参照してください」なんて我ながら最低のドキュメントだなぁ。でもそのほうが下手な説明よりはわかりやすいだろうし...。)

simple functions

以下はバベルの各種関数の説明です。この関数群を抑えておくだけでバベルのほとんどの機能をお手軽に利用できます。関数の中にはクラスとして実装されているものもあります(C++的にはクラスでも使い方は関数と同じです)。
関数名種別説明
babel::init_babel初期化バベルの初期化を行います、必ず最初に一度だけ呼び出しておいてください。現バージョンでは対になる終了関数は存在しません。
babel::analyze_base_encoding分析どのエンコーディングの文字列なのかを分析します。
babel::manual_translate変換指定されたエンコーディング間の変換を行います。UNICODEと非UNICODE間の変換においてBOMの付加/除去は行いません。
babel::translate_to_string変換バイナリデータを元に指定されたエンコーディング間の変換を行い、変換された文字列を返します。UNICODEと非UNICODE間の変換においてはBOMの付加/除去を行います。
babel::auto_translate変換バイナリデータを元に自動でエンコーディングの分析をしたうえで変換を行い、変換された文字列を返します。UNICODEと非UNICODE間の変換においてはBOMの付加/除去を行います。
babel::translate_to_binary変換文字列データを元に指定されたエンコーディング間の変換を行い、変換されたバイナリデータを返します。UNICODEと非UNICODE間の変換においてはBOMの付加/除去を行います。
babel::sjis_to_euc変換シフトJISからEUCへの変換を行います。
babel::sjis_to_jis変換シフトJISからJIS(半角カナ可)への変換を行います。
babel::sjis_to_utf8変換シフトJISからUTF-8への変換を行います。
babel::sjis_to_unicode変換シフトJISからUNICODE(wchar_tベース)への変換を行います。
babel::euc_to_sjis変換EUCからシフトJISへの変換を行います。
babel::euc_to_jis変換EUCからJIS(半角カナ可)への変換を行います。
babel::euc_to_utf8変換EUCからUTF-8への変換を行います。
babel::euc_to_unicode変換EUCからUNICODE(wchar_tベース)への変換を行います。
babel::jis_to_sjis変換JIS(半角カナ可)からシフトJISへの変換を行います。
babel::jis_to_euc変換JIS(半角カナ可)からEUCへの変換を行います。
babel::jis_to_utf8変換JIS(半角カナ可)からUTF-8への変換を行います。
babel::jis_to_unicode変換JIS(半角カナ可)からUNICODE(wchar_tベース)への変換を行います。
babel::jis_to_iso2022jp変換JIS(半角カナ可)からISO-2022-JP(半角カナ不可)への変換を行います。変換元文字列に半角カナが含まれている場合、全角カナに置換されます。
babel::utf8_to_sjis変換UTF-8からシフトJISへの変換を行います。
babel::utf8_to_euc変換UTF-8からEUCへの変換を行います。
babel::utf8_to_jis変換UTF-8からJIS(半角カナ可)への変換を行います。
babel::utf8_to_unicode変換UTF-8からUNICODE(wchar_tベース)への変換を行います。
babel::unicode_to_sjis変換UNICODE(wchar_tベース)からシフトJISへの変換を行います。
babel::unicode_to_euc変換UNICODE(wchar_tベース)からEUCへの変換を行います。
babel::unicode_to_jis変換UNICODE(wchar_tベース)からJIS(半角カナ可)への変換を行います。
babel::unicode_to_utf8変換UNICODE(wchar_tベース)からUTF-8への変換を行います。

UNICODEマッピングについて

SJIS⇔UNICODEのマッピングと一口に言ってもシフトJIS自体に多くのバリエーションが存在するために実際にはいろんな種類のマッピングが存在します。バベルではデフォルトで MS-Windows で使用されているマッピング(CP932)と同じマッピングを適用します。また、バベルは UTC が提唱しているマッピングアップルが公表しているマッピングにも対応しています。UTCとアップルのマッピングではシフトJIS上の "\"(0x5C) が 0x00A5 に割り当てられていたりしますのでご注意ください。

アップルのマッピングではシフトJIS上では1文字のコードに対し複数ワード(って、表現であってる?)の文字が割り当てられていたりもしますのでこれも注意が必要です。恐らくこの複数ワードの文字はアップルのマシン以外で正常に表示されることは(少なくとも現状では)ないと思います。

UTC のマッピングでは半角カナの部分が存在しない為、バベルでは便宜上 CP932 の半角カナのマッピングをコピーして補っています。

その他のマッピング(各種JAVAで使用されているものなど)が必要な場合は適宜、CP932, UTC, APPLE の中から似ているマッピングを元に自作してください。

FAQ

今現在はFAQを用意していません。バベルでよくわからないことがありましたら道化師までメールください。

links

下のリンクはバベルを使ってくださっているソフトウェアです。バベルを使ってくださっている方でこちらでリンクを張っても構わない方は是非ともご連絡ください。