©
This document uses PHP Chinese website manual Release
(PHP 5 >= 5.3.0, PECL intl >= 1.0.2, PECL idn >= 0.1)
idn_to_ascii — Convert domain name to IDNA ASCII form.
过程化风格
$domain
[, int $options
= 0
[, int $variant
= INTL_IDNA_VARIANT_2003
[, array &$idna_info
]]] )This function converts Unicode domain name to IDNA ASCII-compatible format.
domain
Domain to convert. In PHP 5 must be UTF-8 encoded.
options
Conversion options - combination of IDNA_* constants (except IDNA_ERROR_* constants).
variant
Either INTL_IDNA_VARIANT_2003
for IDNA 2003 or
INTL_IDNA_VARIANT_UTS46
for UTS #46.
idna_info
This parameter can be used only if
INTL_IDNA_VARIANT_UTS46
was used for
variant
. In that case, it will be filled with an
array with the keys 'result', the possibly illegal
result of the transformation,
'isTransitionalDifferent', a boolean indicating
whether the usage of the transitional mechanisms of UTS #46 either has
or would have changed the result and 'errors',
which is an int representing a bitset of the error
constants IDNA_ERROR_*.
Domain name encoded in ASCII-compatible form. 或者在失败时返回 FALSE
版本 | 说明 |
---|---|
5.4.0/PECL 2.0.0b1 |
Added the parameters variant and
idna_info ; UTS #46 support.
|
Example #1 idn_to_ascii() example
<?php
echo idn_to_ascii ( 't?st.de' );
?>
以上例程会输出:
xn--tst-qla.de
[#1] edible dot email at gmail dot com [2012-06-03 05:08:38]
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.
[#2] Eman [2010-11-11 04:57:16]
With PHP 5.3 I started to recieve
Fatal error: Only variables can be passed by reference
when trying to call idn_to_ascii with second optional parameter (IDNA_DEFAULT).
Moreover these IDNA_* constants are seem to be undefined in PHP 5.3. + PECL idn 0.0.2
When I tried to uninstall PECL idn and install PECL intl (1.1.1) i recieved this:
/tmp/pear/temp/intl/collator/collator_class.c:92: error: duplicate ??static??
/tmp/pear/temp/intl/collator/collator_class.c:96: error: duplicate ??static??
/tmp/pear/temp/intl/collator/collator_class.c:101: error: duplicate ??static??
/tmp/pear/temp/intl/collator/collator_class.c:107: error: duplicate ??static??
make: *** [collator/collator_class.lo] Error 1
So probably compiling PHP 5.3. from sources with --enable-intl will help, but it only means that PHP 5.3. intl version differs from the one available at PECL, which isn't good, I think.
I've made my code working again by giving second idn_to_ascii parameter as simple integer variable (with value 0), but something bad is going on here and i will not be surprised if it'll break again after another PHP update...