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.