「コード変換ライブラリへの論評」の訳

だいぶ古いんですが、正月頃にboost MLに流れていたBeman Dawesのポストを訳したものが出てきたので、載せておきます。早く標準に入りませんかねえ、これ。

「コード変換ライブラリ提案」への論評(N1683)

written by Beman Dawes, 2005-01-07,
originally a post to boost@lists.boost.org

コード変換ライブラリの追加提案(N1683==04-0123)は、標準ライブラリにはコード変換機能が必要であると提言している(参考:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1683.html)。この機能がないために、国際化(i18n)を考慮したプログラマ車輪の再発明を繰り返すはめに陥っている。過去にBoostは既存のライブラリについて二、三度、Boostパイプラインにあるライブラリについてさらに何度かこの問題にぶち当たっている。この提案はLWGに優先度の高い要求として承認された。

とはいえこの提案にはいくつか問題がある。この文書では、提案のなかでさらに改善できるところを指摘する。

1. wstring_convert内でbyte_stringを直接定義する

wstring_convertを基盤とした設計は、std::basic_stringに準拠した二つの文字型の間で変換を行うのに十分な柔軟性を持っているように思える。実際の変換はinternalT型とexternalT型であらかじめパラメータ化されたstd::codecvtが行う。が、wstring_convert::byte_stringからstd::basic_stringへの変換だけに制限するのは人為的なものに思える。提案されているchar16_tやchar32_tのような新たな文字型についても、他のワイド文字型とのコード変換を必要としているが、現状の制限されたwstring_convertはこの目的で用いることができない。

変更提案:以下を
typedef std::basic_string byte_string;
以下のように変更する:
typedef std::basic_string byte_string;
またこれに従ってfrom_bytesも変更する。

この変更提案が受け入れられれば、wstring_convertのメンバの中には名称を変更したほうが意味が通じるものが出てくるだろう。

2. wstring_convertテンプレートパラメータのElemは必要か

wstring_convertのテンプレートパラメータElemは不要に思える。これは常にCodecvt::intern_typeとになるのではないだろうか?

変更手案:Elemパラメータを削除し、以下を
Elem
以下のように変更する:
Codecvt::intern_type

3. 「ターゲット引数」形式のwstring_convert変換関数

wstring_convertの変換関数は以下の形式である:
byte_string to_bytes(const wide_string& wstr) const;

この形式はしばしば便利でありこのまま残しておくべきであるが、コンパイラが十分に最適化されていなければ余分なコピーが生じてしまう。
提案する変更は以下の形式の別の関数を追加することである:
void to_bytes(const wide_string& wstr, byte_string & target) const;

4. wstring_convertをより明示的な名前に

実際の型と異なる場合、"wstring"は誤読の元である。"convert"は動詞であり、クラス名には名詞を用いたほうが良い。

変更提案:
wstring_convert

string_converter
とする。

5. 標準文書らしい書き方

この提案の"標準文書"方言(standardese)には改善が必要である。例えば、テンプレートパラメータの必要条件は指定されなければならないし、関数の記述は正式の形式に書き換えなければならない。

6. wbuffer_convertにも同様の変更が必要

上述のいずれかの変更が受け入れられたならば、wbuffer_convertも変更する必要がある。

謝辞

この論評はThorsten Ottosen, Stefan Slapeta, and Jonathan Turkanisとの議論を元にしている。

Revised: 05 January 2005