Проблема в преобразовании строки в ненадежный код (в PHP, используя phlyLabs punycode string converter)

Я использую код здесь: http://phlymail.com/en/downloads/idna/download/ и построил такую ​​функцию (из примера):

function convert_to_punycode($inputstring) { $IDN = new idna_convert(); // The input string, if input is not UTF-8 or UCS-4, it must be converted before $inputstringutf8 = utf8_encode($inputstring); // Encode it to its punycode presentation $outputstringpunycode = $IDN->encode($inputstringutf8); return $outputstringpunycode; } 

Однако он не работает должным образом.

 For the input: Россию It gives: РоÑÑÐ¸Ñ Whereas it should give: xn--h1alffa3f 

Что я делаю не так? $ inputstring, которая передается, является обычной строкой без специальных объявлений / etc …

Ваша строка уже UTF-8? Похоже на то. Или это в ISO-8859-5? В обоих случаях вы не можете использовать функцию PHP utf8_encode (), так как она ожидает, что ваша строка ввода будет ISO-88591-1 (ISO Latin-1, западноевропейские языки). Посмотрите файл transcode_wrapper.php, который поставляется с источником класса. Это может вам помочь.

вам может понадобиться расширение PHP IDNA

Я бы просто добавил что-то вроде того, чтобы использовать, если возможно, модуль, в противном случае предложенная Дейвом функция:

 if(!function_exists('idn_to_ascii') and !function_exists('idn_to_utf8')) { define('IDN_FALLBACK_VERSION',2008); require_once('idna_convert.class.php'); function idn_to_ascii($string) { $IDN = new idna_convert(array('idn_version'=>IDN_FALLBACK_VERSION)); return $IDN->encode($string); } function idn_to_utf8($string) { $IDN = new idna_convert(array('idn_version'=>IDN_FALLBACK_VERSION)); return $IDN->decode($string); } function idn_to_unicode($string){return idn_to_utf8($string);} } 

Попробуйте этот метод для преобразования кодировки

 //$inputstringutf8 = utf8_encode($inputstring); $inputstringutf8 = mb_convert_encoding($inputstring, 'utf-8', mb_detect_encoding($inputstring));