iconv(3) 文字セット変換を行う

書式

#include <iconv.h>


size_t iconv(iconv_t cd,
char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft);

説明

iconv() 関数は、ある文字エンコーディングの文字シーケンス列を別の文字 エンコーディングの文字シーケンスに変換する。cd 引き数は変換ディスク リプタ (conversion descriptor) であり、以前は iconv_open(3) を呼び出 すことで生成されていた。変換ディスクリプタは iconv() が変換に使用す る文字エンコーディングを定義するものである。 inbuf 引き数は入力シー ケンスの先頭バイトを指す変数のアドレスであり、inbytesleft は入力シー ケンスのバッファのバイト数を示す。outbuf 引き数は出力バッファで利用 できる先頭バイトを指す変数のアドレスであり、 outbytesleft は出力 バッファのバイト数を示す。

主に使われるのは、 「inbuf が NULL でなく、かつ *inbuf が NULL でない」 という場合である。 この場合、 iconv() 関数は、 *inbuf で始まるマルチバイト文字列を *outbuf で始まるマルチバイト文字列に変換する。 *inbuf を先頭として最大 *inbytesleft バイトが読み込まれ、 *outbuf を先頭として最大 *outbytesleft バイトが書き出される。

iconv() 関数は 1 度に 1 つのマルチバイト文字を変換する。 そして、各文字変換毎に、変換された入力バイトの数だけ *inbuf を増加させ、*inbytesleft を減少させる。 また、変換された出力バイトの数だけ *outbuf を増加させ、*outbytesleft を減少させる。 さらに、cd に含まれる変換状態を更新する。 入力の文字エンコーディングがが状態を持つ場合、 iconv() 関数は入力バイトの列に対して変換にも対応しており、 バイト出力を伴わずに変換状態を更新することができる。 変換は、次の 4 つの場合に停止する。

1.
入力に無効なマルチバイト文字列があった場合。この場合、 関数は errnoEILSEQ に設定し、 (size_t) -1 を返す。 *inbuf は、無効なマルチバイト文字列の先頭を指したままになる。
2.
入力バイト文字列が完全に変換され、*inbytesleft が 0 になった場合。 この場合、 iconv() は呼出しの間に非可逆変換が行われた回数を返す。
3.
入力に不完全なマルチバイト文字列があり、入力バイト文字列がその後で終了 している場合。この場合、関数は、errnoEINVAL に設定し、 (size_t) -1 を返す。 *inbuf は、不完全なマルチバイト文字列の先頭 を指したままにされる。
4.
出力バッファーに次の変換された文字列のための空きがない場合。 この場合、 errnoE2BIG に設定され、 (size_t) -1 が返される。

別のケースとしては、 「inbuf が NULL、または *inbuf が NULL である。 しかし、outbuf が NULL でなく、かつ *outbuf が NULL でない」 という場合がある。 この場合、 iconv() 関数は、cd の変換状態を初期状態にして、 対応するシフト文字列を *outbuf に保存しようとする。 最大 *outbytesleft バイトが、*outbuf を始めとして書き出される。 このリセットされた文字列に対して、出力バッファーに空きがない場合、 この関数は errnoE2BIG に設定し、 (size_t) -1 を返す。 それ以外の場合、この関数は、書き込まれたバイトの数だけ *outbuf を増加させ、*outbytesleft を減少させる。

3 番目のケースしては、 「inbuf が NULL、または *inbuf が NULL である。 かつ、outbuf が NULL、または *outbuf が NULL である」 という場合がある。 この場合、 iconv() 関数は、cd の変換状態を初期状態にする。

返り値

iconv() 関数は、呼出しの間に非可逆な方法で変換された文字数を返す。 つまり、可逆変換はカウントされない。 エラーの場合、この関数は errno を設定し、 (size_t) -1 を返す。

エラー

他のいろいろなエラーのうちから、以下のエラーが起こりうる。
E2BIG
*outbuf に十分な空きがない。
EILSEQ
入力に無効なマルチバイト文字列があった。
EINVAL
入力に不完全なマルチバイト文字列があった。

バージョン

この関数はバージョン 2.1 以降の glibc で利用可能である。

準拠

POSIX.1-2001.

注意

inbufoutbufchar ** 型だが、これらの変数が指す オブジェクトが C の文字列、つまり文字の配列として解釈されることを意味 するわけではない。文字バイトシーケンスの解釈は変換関数の内部で行われる。 エンコーディングによっては、バイト 0 もマルチバイト文字の有効な 構成要素の場合がある。

iconv() の呼び出し元は、 iconv() に渡すポインタが、 必要な文字集合の文字にアクセスするのに適したものとなっていることを 保証しなければならない。これには、アライメントに関して厳しい制限が あるプラットフォームにおいて正しいアライメントになっていることを 保証するといったことも含まれる。

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.65 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。