JPNIC が配布しています「国際化ドメイン名ツールキット(idnkit)」を PHP から利用できる拡張モジュールです。 idnkit ライブラリ(libidnkitlite)を利用して UTF-8 と Punycode とを相互変換できます。
php-idnkit は libidnkitlite を利用しますので、まずは idnkit のインストールを行います。 idnkit のダウンロードは、idnkit download からダウンロードできますので、ダウンロード後インストールを行ってください。
idnkit のインストールが完了したら、php-indkit を PHP に組み込みます。
php-idnkit は、php-idnkit 2003/12/04 版 をダウンロードしてください。
ダウンロードした php-idnkit は PHP のソースディレクトリ中の ext ディレクトリに展開します。
展開後、configure スクリプトに php-idnkit を反映させるために buildconf を実行します。
あとは、configure スクリプト実行時に --with-idnkit[=DIR] を追加して実行し、make/make install を行ってください。
たとえば、
$ gunzip -c php-4.x.y.tar.gz | tar xf -のような手順になります。
$ cd php-4.x.y/ext
$ gunzip -c php-idnkit-20031204.tar.gz | tar xf -
$ cd ..
$ ./buildcond --force
$ ./configure --with-idnkit --with-apxs
$ make
$ make install
| IDNKIT_VERSION | idnkit ライブラリのバージョン番号を表現した文字列 |
| 定数 | 対応する idnkit ライブラリの動作フラグ |
|---|---|
| IDNKIT_DELIMMAP | IDN_DELIMMAP |
| IDNKIT_LOCALMAP | IDN_LOCALMAP |
| IDNKIT_MAP | IDN_MAP |
| IDNKIT_NORMALIZE | IDN_NORMALIZE |
| IDNKIT_PROHCHECK | IDN_PROHCHECK |
| IDNKIT_UNASCHECK | IDN_UNASCHECK |
| IDNKIT_BIDICHECK | IDN_BIDICHECK |
| IDNKIT_ASCCHECK | IDN_ASCCHECK |
| IDNKIT_IDNCONV | IDN_IDNCONV |
| IDNKIT_LENCHECK | IDN_LENCHECK |
| IDNKIT_RTCHECK | IDN_RTCHECK |
| IDNKIT_UNDOIFERR | IDN_UNDOIFERR |
| IDNKIT_ENCODE_QUERY | IDN_ENCODE_QUERY |
| IDNKIT_DECODE_QUERY | IDN_DECODE_QUERY |
| IDNKIT_ENCODE_APP | IDN_ENCODE_APP |
| IDNKIT_DECODE_APP | IDN_DECODE_APP |
| IDNKIT_ENCODE_STORED | IDN_ENCODE_STORED |
| IDNKIT_DECODE_STORED | IDN_DECODE_STORED |
| IDNKIT_NAMEPREP | IDN_NAMEPREP |
| IDNKIT_ENCODE_APP_ERR | IDN_DELIMMAP | IDN_LOCALMAP | IDN_MAP | IDN_NORMALIZE | IDN_PROHCHECK | IDN_BIDICHECK | IDN_ASCCHECK | IDN_IDNCONV | IDN_LENCHECK |
| IDNKIT_DECODE_APP_ERR | IDN_DELIMMAP | IDN_MAP | IDN_NORMALIZE | IDN_PROHCHECK | IDN_BIDICHECK | IDN_IDNCONV | IDN_RTCHECK | IDN_ASCCHECK |
| 定数 | 対応する idn_result_t 型の値 |
|---|---|
| IDNKIT_SUCCESS | idn_success |
| IDNKIT_NOTFOUND | idn_notfound |
| IDNKIT_INVALID_ENCODING | idn_invalid_encoding |
| IDNKIT_INVALID_SYNTAX | idn_invalid_syntax |
| IDNKIT_INVALID_NAME | idn_invalid_name |
| IDNKIT_INVALID_MESSAGE | idn_invalid_message |
| IDNKIT_INVALID_ACTION | idn_invalid_action |
| IDNKIT_INVALID_CODEPOINT | idn_invalid_codepoint |
| IDNKIT_INVALID_LENGTH | idn_invalid_length |
| IDNKIT_BUFFER_OVERFLOW | idn_buffer_overflow |
| IDNKIT_NOENTRY | idn_noentry |
| IDNKIT_NOMEMORY | idn_nomemory |
| IDNKIT_NOFILE | idn_nofile |
| IDNKIT_NOMAPPING | idn_nomapping |
| IDNKIT_CONTEXT_REQUIRED | idn_context_required |
| IDNKIT_PROHIBITED | idn_prohibited |
| IDNKIT_FAILURE | idn_failure |
string idnkit_encodename(string name [, int actions] )
例)
echo idnkit_encodename(mb_convert_encoding("日本語JPドメイン名.jp", "UTF-8", "auto"));
string idnkit_decodename(string name [, int actions] )
例)
echo mb_convert_encoding(idnkit_decodename( $_SERVER["HTTP_HOST"] ), "EUC-JP", "UTF-8");
int idnkit_errno()
string idnkit_error()
php-idnkit では、libidnkitlite が提供している機能のうち api モジュールに含まれる idn_encodename と idn_decodename を利用できます。ただし、以下の制限があります。
idn_nameinit(1); によって行われます。
とりあえず、PHP 4.2.3 と PHP 4.3.3 でテストをしています。
複雑な処理をしているわけではないので、PHP 4.2.x および PHP 4.3.x では使えると思いますが、うまくコンパイルできない場合にはご連絡ください。
libidnkit では iconv を利用してコード変換をするため、PHP で標準的に使われている mbstring モジュールと変換ルールが異なると混乱するかと思い、UTF-8 と Punycode との相互変換のみを扱うようにするため libidnkitlite を利用しています。
2003/12/03 版では、idn_* で関数を定義していましたが、GNU IDN Library を利用した PHP-IDN が idn_* となっていましたので、idnkit_* の関数名に変更しました。
勢いで、Ruby 用の拡張モジュール、ruby-idnkit 2003/12/08 版 も作ってみました。興味のある人はどうぞ。
2003/12/05 版では、ruby 1.6 系ではエラーとなるようなので、ちょっと関数(マクロ)を差し替えました。
ちなみに、UTF-8 <=> Punycode の相互変換のみなんで、UTF-8 へは自力で変換してください。
Presented by Kazuhiko Iwama.