idn_to_ascii

(PHP 5 >= 5.3.0, PHP 7, PECL intl >= 1.0.2, PECL idn >= 0.1)

idn_to_asciiドメイン名をIDNAのASCII形式に変換する

説明

手続き型

string idn_to_ascii ( string $domain [, int $options = 0 [, int $variant = INTL_IDNA_VARIANT_2003 [, array &$idna_info ]]] )

Unicode のドメイン名を、IDNAが定めたASCII形式に変換します。

パラメータ

domain

変換するドメイン名。UTF-8 にエンコードされている必要があります。

options

変換オプション - IDNA_ ではじまる定数 (IDNA_ERROR_* 定数を除く) の組み合わせです。

variant

IDNA 2003 の場合は INTL_IDNA_VARIANT_2003、あるいは UTS #46 の場合は INTL_IDNA_VARIANT_UTS46

idna_info

このパラメータを使うのは、variantINTL_IDNA_VARIANT_UTS46 の場合だけです。 このとき、このパラメータには 'result''isTransitionalDifferent'、そして 'errors' の三つのキーを含む配列が入ります。 'result' にはおそらく不正だと考えられる変換結果、 'isTransitionalDifferent' には UTS #46 の非移行的な機能を使って結果を変更したかどうかをあらわす boolean 値、そして 'errors' はエラー定数 IDNA_ERROR_* のビットセットを表します。

返り値

IDNA のASCII形式でエンコードされたドメイン名。失敗した場合に FALSE を返します

変更履歴

バージョン 説明
7.2.0 INTL_IDNA_VARIANT_2003 は非推奨です。代わりに INTL_IDNA_VARIANT_UTS46 を使用してください。
5.4.0/PECL 2.0.0b1 パラメータ variantidna_info が追加され、UTS #46 をサポートするようになりました。

例1 idn_to_ascii() の例

<?php

echo idn_to_ascii('tast.de'); 

?>

上の例の出力は以下となります。

xn--tst-qla.de

参考

  • idn_to_utf8() - IDNAのASCII方式でエンコードされたドメイン名をUnicodeに変換する

add a note add a note

User Contributed Notes 2 notes

up
16
edible dot email at gmail dot com
5 years ago
The notes on this function are not very clear and a little misleading.

Firstly, <=5.3, you will need to make use of one of several scripts or classes available on the internet which might, or might not, require the installation of of the intl and idn PECL extensions ...and you will need to have !<4.0 in order to be able to install both.

Secondly, if you have >=5.4 you will not require the PECL extensions.

Third, use of utf8_encode() is not necessary.  In fact, it will potentially prevent idn_to_ascii() from working at all.

On my setup it was necessary to change the charset in the script meta tags to UTF-8:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

...and to change charset_default in the php.ini file (/usr/local/lib/php.ini, whereis php.ini, find / -name php.ini):

default_charset = "UTF-8"

The above changes mean that idn_to_ascii() can now be used with that syntax (no need for utf8_encode()).  Previously, the function worked to convert some IDNs, but failed to convert Japanese and Cyrillic IDNs.  Further, no additional locales were enabled or added, and Apache's charset file was left unmodified.

It is also important to remember only to apply the function where required, eg:

idn_to_ascii(cåsino.com) // is wrong

...whereas...

iden_to_ascii(cåsino) // is right

...and also be aware of text editors that don't support UTF-8 encoding, or the $domain = 'cåsino' value will end up as $domain = '??????' ...and the function will fail.

I have found that Notepad++ easily and reliably handles UTF-8 encoding that works for this function using UTF-8 as the encoding option, not UTF-8 without BOM.
up
1
mschrieck at gmail dot com
9 months ago
To convert IDN Domains with the IDNA2008 definition use following command.

idn_to_ascii('teßt.com',IDNA_NONTRANSITIONAL_TO_ASCII,INTL_IDNA_VARIANT_UTS46)

The result is then as expected

xn--tet-6ka.com
To Top