2014-10-24 2 views
1

В проекте 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 (извините за звучание этого «два на„два“).

ответ

1

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

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

Фактически, наши chromes автоматически конвертировать 中島第2駐輪場.com в 中島第2駐輪場.com перед обращением

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

ОБНОВЛЕНО:
Это, кажется, invaild ... Validation Result

+1

Спасибо за этот ответ. Но имя followinf: 銘 備 前 国 長 船 与 三 左衛 門 尉 祐 定 為 為 之 之 之 не содержит символов [A-Z0-9], но не может быть преобразовано. В противном случае, спасибо, потому что ваш ответ позволяет мне найти RFC3454. Я не нашел никакой функции php для преобразования символа не ascii в ascii-символ (например, от 2 до 2).Нет никакой функции php для использования NAMEPREP, и поиск возвращает только некоторые домашние библиотеки. – jedema

+1

@jedema '銘 備 前 国 長 船 与 三 左衛 門 尉 之 之 недействителен – mpyw

+1

@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

0

Без PECL/или PECL Intl/IDN, у меня были проблемы получив встроенный idn_to_utf8() для работы!

This alternative: 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

PECL/intl теперь находится в моем плане хостинга. Функция idn_to_utf8() проще в использовании: вы просто загружаете полное имя домена, закодированного в IDN, и возвращаете ответ UTF8! –

 Смежные вопросы

  • Нет связанных вопросов^_^