iconv(アイコンブ)は異なる文字コード間の相互変換を行う標準API。または、そのAPIに付属する文字コード変換ユーティリティプログラム。名前は「International Codeset Conversion Library」に由来する[1]。GNUによる実装[2]が有名で、変換ライブラリ libiconv のライセンスはLGPL、変換プログラム iconv のライセンスはGPLである。

iconv API 編集

iconvのAPIは、おもにUNIX環境で文字列の文字コード変換を行う標準インタフェースである。iconvは最初HP-UXで開発され、後にPOSIX規格として標準化された。そのため、ほとんどのUnix系のシステムで使用できる。

iconv APIは文字コード変換プログラムのほか、既存のプログラムを国際化または多言語化するためにも用いられる。例えば、Sambaの国際化にはiconvが利用されている。

互換性 編集

XML処理用ライブラリであるlibxmlがiconvを必要としているため、libxmlを使用したアプリケーションソフトウェアを利用する場合にもiconvを必要とする。

Microsoft Windows上では、CygwinGnuWin32等のUnixライクな環境をインストールすることで、iconv APIやiconvプログラムを利用できるようになる。

プログラミング言語の標準ライブラリにAPIが組み込まれている場合がある。

PHP
PHPスクリプトからiconvの機能を利用することができる(WindowsのPHPでも付属のDLL (iconv.dll)により利用可能)。
バージョン1.9以前のRuby
それ以降のバージョンではそのプラットフォーム依存性から非推奨扱いになっており、String#encodeを代替とする。

日本語の対応状況 編集

GNU Cライブラリのiconvでは2019年5月現在のところ、EUC-JPEUC-JIS X0213Shift_JISShift_JIS X0213CP932ISO-2022-JPISO-2022-JP-2ISO-2022-JP-1ISO-2022-JP-MSISO-2022-JP-3等の日本語の文字コードに対応している[2]。また、UnicodeのエンコーディングであるUTF-8UTF-16UTF-32UTF-7にも対応している[2]

古くから使用されているnkfと異なり、多くの環境で標準的に使用できるが、一部の文字でnkfと変換結果が異なる点で注意を要する。 また、nkfに存在するエンコードの自動検出機能は存在しない。

使用例 編集

特に意識していなくても、多くの非英語環境向けのUNIXプログラムの内部で間接的に使用されているが、もちろんユーザが明示的に使用することもできる。

ここでは、Shift_JISのテキストファイルsjis.txtを、UTF-8に変換し、utf8.txtとして保存する場合のコマンドの例を示す。

シェルからiconvコマンドで変換する場合 編集

次のコマンドを実行することで変換できる。

iconv -f Shift_JIS -t UTF-8 sjis.txt > utf8.txt

自作プログラムからiconvライブラリを使用し変換する場合 編集

次のC言語ソースをコンパイルし、実行することで変換できる。

ただし、簡単のためエラー処理は省略しているので、このまま実用プログラムに使用しないこと。

#include <stdio.h>
#include <iconv.h>

#define S_SIZE (1024)

int main(void) {
  iconv_t icd;
  FILE *fp_src, *fp_dst;
  char s_src[S_SIZE], s_dst[S_SIZE];
  char *p_src, *p_dst;
  size_t n_src, n_dst;

  icd = iconv_open("UTF-8", "Shift_JIS");
  fp_src = fopen("sjis.txt", "r");
  fp_dst = fopen("utf8.txt", "w");

  while (1) {
    fgets(s_src, S_SIZE, fp_src);
    if (feof(fp_src))
      break;
    p_src = s_src;
    p_dst = s_dst;
    n_src = strlen(s_src);
    n_dst = S_SIZE-1;
    while (0 < n_src) {
      iconv(icd, &p_src, &n_src, &p_dst, &n_dst);
    }
    *p_dst = '\0';
    fputs(s_dst, fp_dst);
  }

  fclose(fp_dst);
  fclose(fp_src);
  iconv_close(icd);

  return 0;
}

脚注 編集

外部リンク 編集