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

PHP:idn_to_utf8()存在问题。某些域未转换,php,unicode,converter,punycode,Php,Unicode,Converter,Punycode,在一个PHP项目中,我使用idn_to_utf8函数将域名从punycode转换为unicode字符串 但有时此函数返回punycode而不是unicode字符串 例如: echo idn_to_utf8('xn--fiq57vn0d561bf5ukfonh1o'); // Return : xn--fiq57vn0d561bf5ukfonh1o // It should return : 中島第2駐輪場 echo idn_to_utf8('xn--fiqu6mnndw87c3ucbt0a1ea

在一个PHP项目中,我使用idn_to_utf8函数将域名从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(),但我更喜欢使用PHP函数而不是库

你知道这个问题的根源吗

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

echo idn_to_ascii('吉津第2自転車置場');
?><br /><?php
echo idn_to_utf8(idn_to_ascii('吉津第2自転車置場'));
?> Should be : 吉津第2自転車置場 <br /><?php
将idn\u回送到ascii('吉津第2自転車置場');

?>
应为:吉津第2自転車置場
这很好。我认为字符
[A-Z0-9]无法使用

echo idn_to_utf8('xn--2-kq6aw43af1e4y9boczagup'); // 中島第2駐輪場
事实上,我们的色度将自动转换
中島第2駐輪場.com
转换为
中島第2.駐輪場.com
,然后再访问

更新:
似乎提供了名为
NAMEPREP
的规范化规则:

更新:
那似乎是入侵。。。
如果没有PECL/intl或PECL/idn,我很难让内置的
idn\u to_utf8()
正常工作

,对我来说很好。 将域名作为一个整体:

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);

谢谢你的回答。但是下面的名字:銘備前国長船与三左衛門尉祐定為栗山与九郎作之 不包含任何字符[A-Z0-9] 但是它不能被转换。否则,谢谢你,因为你的回复允许我找到RFC3454。我没有找到任何php函数来将非ascii字符转换为ascii字符(比如2 不存在使用NAMEPREP的php函数,搜索只返回一些自制的库。@jedema
銘備前国長船与三左衛門尉祐定為栗山与九郎作之是invalid@jedema你应该使用而不是你正在使用的。谢谢你的编码器。我使用的这些太随意了。但是你有PHP函数来转换吗2 我不认为我是唯一一个有这个问题的人。再次感谢你。具体的标准化IDNA就是这样做的2 to 2是Unicode规范化表单KC.PHP intl ext:(Form_KC)PECL/intl现在在我的托管计划中。idn_to_utf8()函数更易于使用:您只需输入整个idn编码的域名,并返回utf8答案!