libjconv関数リファレンス
int
jconv_alloc_apply_iconv (iconv_t cd,
const char *buffer,
size_t len,
char **buffer_r,
size_t *len_r,
size_t *error_pos_r);
引数cdで示されるiconvハンドルを利用してコードセット変換を実行します。引数bufferには変換元のバッファ(nul文字を含んでいてもよく、nulで終わっていなくても構わない)を指定し、引数lenには変換元のバッファのバイト数を指定します。コードセット変換の結果はmallocによりヒープから確保されたメモリ領域に収納され、引数buffer_rの指す先へそのメモリ領域のアドレスが代入されます。そのメモリ領域のバイト数(変換結果のバイト数)は引数len_rの指す先へ代入されます。よって変換結果は、アドレス*buffer_rからの*len_rバイトに格納されています。変換結果は常に終端にnul文字がつけられます。もし変換が失敗した場合は、変換元バッファ中のエラー発生箇所のオフセットがerror_pos_rの指す先へ代入され、関数は0でない値を返します。よってbuffer + *error_pos_rがエラー発生箇所になります。変換が成功した場合はこの関数は0を返します。エラーが発生した場合でも途中までの変換結果が*buffer_rに書き込まれるため、この関数がエラーになったか否かにかかわらず*buffer_rがNULLでない場合はユーザがfreeしなければなりません。
もし変換先のコードセットがステートフルなものであった場合は、この関数で得られる変換先のバッファには(必要なら)リセットシーケンスが書きこまれ、バッファの末では常に初期ステートになります。たとえば変換先のコードセットがISO-2022-JPの場合、変換元バッファの最後の文字がJIS-X-0208文字集合のものであっても、変換先のバッファの最後にはASCIIに戻すシーケンスが書きこまれます。この関数が失敗した場合、関数は0でない値を返します。発生したエラーの種類はerrno変数ではなく、関数の返り値で判別します。起こりうるエラーは次のとおりです。
- ENOMEM
- ヒープからメモリを取得するのに失敗した。メモリが不足している。
- EILSEQ
- 変換元バッファの中に、変換元コードセットとして不正なバイト列が見つかったか、変換先コードセットへ変換できない文字が見つかった。このとき*error_pos_rが、buffer中のエラーが発生したオフセットになる。
- EINVAL
- 変換元バッファの最後に不完全なバイト列が付いている。これはたとえば、変換元バッファの末尾が2バイト文字の1バイト目で終わっているときにおこる。
- E2BIG
- iconvが全く変換を実行しないにもかかわらず正常終了した。もしlenが0ではないにもかかわらずこのエラーが発生したなら、iconvの実装に問題がある。
int
jconv_alloc_conv (const char *src,
size_t src_len,
char **dest_r,
size_t *dest_len_r,
const char *const *src_codesets,
int num_src_codesets,
int *actual_codeset_r,
const char *dest_codeset);
srcとsrc_lenで示されるバッファのコードセットを変換し、結果を*dest_rと*dest_len_rに格納します。*dest_rはヒープから確保されます。src_codesetsとnum_src_codesetsで変換元コードセットの候補を指定し、dest_codesetには変換先コードセットを指定します。srcとsrc_lenで示されるバッファがsrc_codesetsの中のいずれかのコードセットとして正しいものであればこの関数は0を返し、*actual_codeset_rにはsrc_codesets中適合したコードセットの番号がセットされます。いずれのコードセットにも適合しなかった場合は0以外の値を返します。起こりうるエラーは次のとおりです。
- ENOMEM
- メモリが不足している。
- EMFILE
- プロセスが開けるファイル数の制限に達したためiconvハンドルが取得できない。
- ENFILE
- システムが開けるファイル数の制限に達したためiconvハンドルが取得できない。。
- EINVAL
- OSがサポートしていないコードセットを指定した。
そのほかにもjconv_alloc_apply_iconvが返すエラーをそのまま返すことがあります。EINVALは、OSがサポートしていないコードセットを指定したのが原因で起こることもあれば、jconv_alloc_apply_iconvがEINVALを返した(末尾に不完全なバイト列があった)ことによる場合もあります。もし*dest_rがNULLならば前者が原因で、NULLでないならば後者が原因です。
int
jconv_alloc_conv_autodetect (const char *src,
size_t src_len,
char **dest_r,
size_t *dest_len_r,
const char *const *src_codesets,
int num_src_codesets,
int *actual_codeset_r,
const char *dest_codeset);
この関数はほとんどjconv_alloc_convと同じ動作をしますが、dest_codesetにNULLを許すのと、num_src_codesetsに0を許す点だけが異なります。dest_codesetがNULLの場合は、jconv_info_get_current_codeset関数の返す値を指定したのと同じことになります。num_src_codesetsが0の場合は、src_codesetsとnum_src_codesetsにjconv_info_get_pref_codesets関数で得られるコードセットのリストを指定したのと同じことになります。
char *
jconv_strdup_conv_autodetect (const char *src,
const char *dest_codeset,
const char *src_codeset,
...);
この関数はjconv_alloc_conv_autodetectとほぼ同等の機能を持ちますが、扱うバッファが常に文字列(nulで終了するようなバイト列へのポインタ)である点が異なります。この関数はコードセット変換が成功するとヒープから確保された文字列を返し、コードセット変換に失敗するとstrdup(src)を返します。ヒープメモリが不足した場合はNULLを返します。変換元コードセットは可変長引数を使って指定します。この関数への最後の引数は必ずNULLでなくてはなりません。この関数はnul終端文字列を対象としているため、nul文字を含むことがあるコードセット(UCS2など。厳密にはUTF8もnul文字を含むことがある)は変換元や変換先のコードセットとして利用できません。またエラーが発生しても原因を知る方法がありません。
char *
jconv_strdup_conv_fullauto (const char *src);
この関数はjconv_strdup_conv_autodetect(src, NULL, NULL)と同等です。
char *
convert_kanji_auto (const char *src);
この関数はjconv_strdup_conv_fullauto(src)と同等です。古いバージョンとの互換性のために残してあります。
char *
convert_kanji (const char *src, const char *dest_codeset);
この関数はjconv_strdup_conv_autodetect(src, dest_codeset, NULL)と同等です。古いバージョンとの互換性のために残してあります。
char *
convert_kanji_strict (const char *src,
const char *dest_codeset,
const char *src_codeset);
この関数はjconv_strdup_conv_autodetect(src, dest_codeset, src_codeset, NULL)と同等です。古いバージョンとの互換性のために残してあります。
void
jconv_info_init (const char *conffile);
この関数はjconv_info_get_current_codesetやjconv_info_get_pref_codesetsが返すテーブルを初期化します。テーブルのデータはconffileで示されるファイルから読み取られ、現在のロカール(setlocaleで設定されたロカール)にしたがってjconv_info_get_current_codesetやjconv_info_get_pref_codesetsの返すべき値がセットされます。よってこの関数はsetlocaleでロカールを設定した後に呼び出すべきです。conffileがNULLの場合は/etc/libjconv/default.confが指定されたのと同じことになります。この関数はマルチスレッドセーフではありません。libjconvのコードセット変換関数(jconv_alloc_conv_autodetectなど)は、もしjconv_info_initがまだ実行されていないなら、jconv_info_init(NULL)を内部で暗黙のうちに呼び出してテーブルを初期化します。もしあらかじめjconv_info_initを明示的に呼んでいれば、jconv_alloc_conv_autodetectなどのコードセット変換関数は全てマルチスレッドセーフになります。なおjconv_alloc_apply_iconvとjconv_alloc_convはjconv_info_get_current_codesetやjconv_info_get_pref_codsetsを利用しないため常にマルチスレッドセーフです。
const char *
jconv_info_get_current_codeset (void);
現在のロカールのマルチバイト文字列のコードセットの名前を返します。
const char *const *
jconv_info_get_pref_codesets (int *num_codesets_r);
現在のロカールと関係の深いコードセットのリストを返します。返されるコードセットの個数が*num_codesets_rにセットされます。
Akira Higuchi