Unicode — PHP: проблема с idn_to_utf8 (). Некоторые домены не конвертируются

В проекте 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&декодирования =% 3C% 3C + Декодирование&Ланг = де) но я предпочитаю использовать функцию PHP, чем библиотека.

У вас есть идеи о происхождении этой проблемы?

Редактировать / Решение и Объяснение : Подводя итог и объяснить проблему:
Этот код показывает проблему:

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

Этот код отображает следующее:

х — 2-958a11kws1a96p50fgxenr6afga

第 津 第 2 自 転 車 置 場 (должно быть): 吉 津 第 2 自 転 車 置 場

Чтобы быть более ясным : Когда мы получаем punycode из 吉 津 第 2 自 転 車 場 場, перед преобразованием этой строки PHP преобразует его в 第 津 第 2 自 転 置 場 (символ «2» отличается). Итак, с idn_to_ascii Функция, которую мы не можем преобразовать все символы Юникода, потому что PHP конвертирует некоторые символы Юникода в другие (в этом примере PHP конвертирует 2 в 2 (извините за звучание этого «два в два»).

1

Решение

Это отлично работает. Я думаю персонажи [A-Z0-9] не может быть использован.

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

На самом деле, наши цвета будут автоматически конвертировать 中島第2駐輪場.com в 中島第2駐輪場.com до доступа.

ОБНОВЛЕНО:
Правило нормализации с именем NAMEPREP Кажется, будет предоставлено: https://www.nic.ad.jp/ja/dom/idn.html

ОБНОВЛЕНО:
Это, кажется, захвачено …
Результат валидации

1

Другие решения

Без 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);
0