В проекте PHP я использую функцию idn_to_utf8 для преобразования имени домена из punycode в строку юникода.PHP: выпуск с idn_to_utf8(). Некоторые домены не конвертируются
Но иногда эта функция возвращает 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
Этот код показывает следующее:
х - 2- 958a11kws1a96p50fgxenr6afga
吉 津 第 2 自 転 車 置 場 (Должно быть): 吉 津 第 2 自 転 車 置 場
Чтобы быть более ясным: Когда мы получим Punycode из 吉 津 第 2 自 転 車 置 場 перед преобразовать эту строку PHP преобразовать его в 吉 津 第 2 自 転 車 置 場 (Символ "2" отличается). Так, с idn_to_ascii функции мы не можем преобразовать все символы Юникода, поскольку PHP преобразовать определенный юникод характер другим (в данном примере PHP преобразует 2 в 2 (извините за звучание этого «два на„два“).
Спасибо за этот ответ. Но имя followinf: 銘 備 前 国 長 船 与 三 左衛 門 尉 祐 定 為 為 之 之 之 не содержит символов [A-Z0-9], но не может быть преобразовано. В противном случае, спасибо, потому что ваш ответ позволяет мне найти RFC3454. Я не нашел никакой функции php для преобразования символа не ascii в ascii-символ (например, от 2 до 2).Нет никакой функции php для использования NAMEPREP, и поиск возвращает только некоторые домашние библиотеки. – jedema
@jedema '銘 備 前 国 長 船 与 三 左衛 門 尉 之 之 недействителен – mpyw
@jedema Вы должны использовать [этот кодер] (http://mct.verisign-grs.com/convertServlet?input= % E9% 8A% 98% E5% 82% 99% E5% 89% 8D% E5% 9B% BD% E9% 95% B7% E8% 88% B9% E4% B8% 8E% E4% B8% 89% Е5 % B7% A6% E8% A1% 9B% E9% 96% 80% E5% B0% 89% Е7% A5% 90% E5% AE% 9A% E7% 82% BA% E6% A0% 97% E5% В1 % B1% E4% B8% 8E% E4% B9% 9D% E9% 83% 8E% E4% BD% 9C% E4% B9% 8B) вместо того, который вы используете. – mpyw