Oracle Solaris でのアプリケーションの国際化とローカライズ

印刷ビューの終了

更新: 2014 年 7 月
 
 

iconv 関数を使用したコードセットの変換

コード変換用に libc ライブラリ内に用意されている iconv() 関数は次のとおりです。

iconv_open()

コード変換の割り当て関数

iconv()

コード変換関数

iconv_close()

コード変換の割り当て解除関数

iconvctl()

コード変換の動作を制御して問い合わせます

iconvstr()

文字列ベースのコード変換関数

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);