PHP:idn_to_utf8()存在问题。某些域未转换
在一个PHP项目中,我使用idn_to_utf8函数将域名从punycode转换为unicode字符串 但有时此函数返回punycode而不是unicode字符串 例如: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
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答案!