1

在一个 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 ( 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自転车置场</p>

更清楚一点:当我们得到吉津第2自転车置场的punycode时,在转换这个字符串之前,PHP将其转换为吉津第2自転车置场(字符“2”不同)。因此,使用idn_to_ascii函数我们无法转换所有 unicode 字符,因为 PHP 将某些 unicode 字符转换为其他字符(在本例中 PHP 将 2 转换为 2(对不起,这个“二到”的发音)。

4

2 回答 2

1

这工作正常。我认为[A-Z0-9]不能使用字符。

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

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

更新:似乎提供了
一个名为的规范化规则: https ://www.nic.ad.jp/ja/dom/idn.htmlNAMEPREP

更新:
这似乎是无效的...... 验证结果

于 2014-10-24T09:17:56.587 回答
0

如果没有 PECL/intl 或 PECL/idn,我很难让内置程序idn_to_utf8()正常工作!

这个替代方案: 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);
于 2016-01-13T12:37:01.047 回答