コード変換用に libc ライブラリ内に用意されている iconv() 関数は次のとおりです。
コード変換の割り当て関数
コード変換関数
コード変換の割り当て解除関数
コード変換の動作を制御して問い合わせます
文字列ベースのコード変換関数
iconv 関数では、コードセット間で文字または文字のシーケンスをコード変換できます。iconv_open() 関数はさまざまなコードセットをサポートしています。次のコマンドを実行して、システムで現在使用可能なサポートされているコードセットとその別名に関する情報を表示できます。
$ iconv -l
iconv モジュールは複数のパッケージに含まれているので、追加のパッケージをインストールすることで、使用可能な変換のデフォルトのリストを拡張できます。デフォルトのインストールには system/library/iconv/utf-8 パッケージが含まれ、これに、UTF-8、Unicode、その他の選択されたコードセット間で変換を行うための iconv モジュールの基本セットが含まれています。
Package Manager アプリケーションまたは pkg コマンドを使用すると、追加のパッケージをインストールできます。Package Manager を使用してインストールを行う場合、追加のパッケージは System/Internationalization カテゴリで使用できます。pkg コマンドを使用する場合、インストールには system/library/iconv/* という名前パターンを使用します。
iconv 変換モジュールは fromcode%tocode.so という形式で、iconv 関数でこれらを使用するには、/usr/lib/iconv ディレクトリの下の iconv モジュールライブラリに存在する必要があります。したがって、iconv -l コマンドによってリストされるどの 2 つのコードセット間の変換もできません。すべての iconv パッケージがインストールされており、必要なモジュールが使用できない場合は、UTF-32 などの Unicode エンコーディングを中間コードセットとして使用して、2 ステップの変換を実行できます。または、カスタム変換モジュールを開発できます。カスタムの iconv 変換モジュールを作成するには、geniconvtbl ユーティリティーを使用します。geniconvtbl ユーティリティーの入力ファイル形式の詳細は、geniconvtbl(4) のマニュアルページを参照してください。
使用例 2-9 iconv_open() を使用した変換記述子の作成次のコード抜粋部分は、iconv_open() 関数を使用して、文字列 złoty (ポーランドの通貨) を 1 バイトの ISO 8859-2 コードセットから UTF-8 に変換する方法を示しています。iconv による変換を実行するには、iconv_open() 関数の呼び出しを含む変換記述子を作成し、呼び出しが正常に行われたことを検証する必要があります。
#include <iconv.h> #include <stdio.h> iconv_t cd; : cd = iconv_open("UTF-8", "ISO8859-2"); if (cd == (iconv_t)-1) { (void) fprintf(stderr, "iconv_open() failed"); return(1); }
ターゲットのコードセットが iconv_open() 関数に対する最初の引数になります。
使用例 2-10 iconv() を使用した変換次のコード抜粋部分は、iconv() 関数を使用してコードセット間の変換を行う方法を示しています。
実際の変換を行う前に、出力バッファーや、入力バッファーと出力バッファーに残っているバイト数など、iconv の呼び出しによって返される情報を保持するために、特定の変数を適用する必要があります。
ISO 8859-2 コードセットでは、L WITH STROKE 文字は 16 進数の 0xB3 で表されます。つまり、入力文字列を保持する入力バッファー (inbuf) は、表示目的で、z\xB3oty に設定されます。inbuf のコンテンツは、ストリームまたはファイルを読み取った結果になります。
#include <iconv.h> #include <stdio.h> #include <errno.h> : int ret; char *inbuf; size_t inbytesleft, outbytesleft; char outbuf[BUFSIZ]; char *outbuf_p; inbuf = "z\xB3oty"; inbytesleft = 5; /* the size of the input string */
出力バッファーで変換された文字列を保持するためには、少なくとも 6 バイトが必要です。L WITH STROKE 文字は Unicode 文字の LATIN SMALL LETTER L WITH STROKE に変換されます。これは UTF-8 では 2 バイトシーケンスの 0xC5 0x82 として表されます。
ほとんどの場合、結果の文字列の実際のサイズは変換前にはわからないので、出力バッファーには十分に余裕のあるスペースを割り当てるようにしてください。この場合、stdio.h で定義されている BUFSIZ マクロは十分です。
outbytesleft = BUFSIZ; outbuf_p = outbuf;
この変換の呼び出しは、前述の例にある変換記述子 cd を使用します。
ret = iconv(cd, &inbuf, &inbytesleft, &outbuf_p, &outbytesleft);
iconv を呼び出したあとは、正常に呼び出されたことを確認する必要があります。呼び出しが成功し、出力バッファーにまだスペースがある場合は、文字列を Null 文字で終了させる必要があります。
if (ret != (size_t)-1) { if (outbytesleft == 0) { /* Cannot terminate outbuf as a character string; error return */ return (-1); } /* success */ *outbuf_p = '\0'; : }
呼び出しに成功すると、outbuf には UTF-8 コードセットの文字列が含まれます。これは 16 進数の \x7a\xc5\x82\x6f\x74\x79 または z\xc5\x82oty で表記されます。inbuf は、変換された文字列の末尾を指すようになります。inbytesleft は 0 になります。outbytesleft は、出力バッファーに格納されるバイト数の 6 ずつ減分されます。outbuf_p は outbuf の出力文字列の末尾を指します。
呼び出しに失敗した場合は、次のコード例に示すように、errno 値を確認してエラー事例を処理します。
if (ret != (size_t)-1)) { if (errno == EILSEQ) { /* Input conversion stopped due to an input byte that * does not belong to the input codeset. */ : } else if (errno == E2BIG) { /* Input conversion stopped due to lack of space in * the output buffer. */ : } else if (errno == EINVAL) { /* Input conversion stopped due to an incomplete * character or shift sequence at the end of the * input buffer. */ : } }
最後に、変換記述子とそれに関連付けられたメモリーの割り当てを解除します。
iconv_close(cd);