PHP:idn_to_utf8()的问题。某些域未转换

时间:2014-10-24 09:05:49

标签: php unicode converter punycode

在PHP项目中,我使用 idn_to_utf8 函数将domaine名称从punycode转换为unicode字符串。

但有时这个函数会返回punycode而不是unicode字符串。

示例:

echo idn_to_utf8('xn--fiq57vn0d561bf5ukfonh1o');
// Return : xn--fiq57vn0d561bf5ukfonh1o
// It should return : 中島第2駐輪場
echo idn_to_utf8('xn--fiqu6mnndw87c3ucbt0a1ea684a');
// Return : 中味鋺自転車置場

有些库正确地转换了punycode(http://idnaconv.phlymail.de/index.php?encoded=xn--fiq57vn0d561bf5ukfonh1o&decode=%3C%3C+Decode&lang=de),但我更喜欢使用PHP函数而不是库。

你对这个问题的根源有什么看法吗?

编辑/解决方案和说明:总结并解释问题: 此代码显示问题:

echo idn_to_ascii('吉津第2自転車置場');
?><br /><?php
echo idn_to_utf8(idn_to_ascii('吉津第2自転車置場'));
?> Should be : 吉津第2自転車置場 <br /><?php

此代码显示以下内容:

  

XN - 2-958a11kws1a96p50fgxenr6afga

     

吉津第2自転车置场(应该是):吉津第2自転车置场

要更清楚:当我们得到吉津第2自転车置场的punycode时,在转换此字符串之前PHP将其转换为吉津第2自転车置场(字符&#34; 2&#34 ; 是不同的)。因此,使用 idn_to_ascii 函数,我们无法转换所有unicode字符,因为PHP会将某些unicode字符转换为其他字符(在此示例中,PHP会将2转换为2(很抱歉听到这个&#34;两个)到&#34;两个&#34;)。

2 个答案:

答案 0 :(得分:1)

这很好用。我认为不能使用字符[A-Z0-9]

echo idn_to_utf8('xn--2-kq6aw43af1e4y9boczagup'); // 中島第2駐輪場

事实上,我们的chromes会在访问之前自动将中島第2駐輪場.com转换为中島第2駐輪場.com

<强>更新:
似乎提供了名为NAMEPREP的规范化规则:https://www.nic.ad.jp/ja/dom/idn.html

<强>更新:
这似乎是不可能的...... Validation Result

答案 1 :(得分:0)

没有PECL / intl或PECL / idn,我无法使内置idn_to_utf8()正常工作!

This alternative: IdnaConv.net,对我有用。 将域名作为一个整体:

include(__DIR__.'/IdnaConvert.php');$IDNA=new \Mso\IdnaConvert\IdnaConvert();
$domain='xn--b1amarcd.xn--ehq889crwebw5c4qa.net';//'новини.三明治餐馆.net';
$parts=explode('.',$domain);$utf8parts=[];
foreach($parts AS $part){
    if(\substr($part,0,4)==='xn--'){
        $utf8parts[]=$IDNA->decode($part);
    }else{
        $utf8parts[]=$part;
}   }
$utf8domain=implode('.',$utf8parts);