Проблема при преобразовании строки в код puny (в PHP, используя преобразователь строк puny code от phlyLabs)
Я использую код отсюда: 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
Что я делаю неправильно? Передаваемая $inputtring является обычной строкой без специальных объявлений / etc...
4 ответа
Ваша строка уже UTF-8? Похоже на то. Или это в ISO-8859-5? В обоих случаях вы не можете использовать функцию PHP utf8_encode(), так как она ожидает, что вашей входной строкой будет ISO-88591-1 (ISO Latin-1, западноевропейские языки). Посмотрите в файл transcode_wrapper.php, который поставляется с источником класса. Это может помочь вам.
Я бы просто добавил что-то вроде использования модуля, если это возможно, иначе Дейв предложил функцию:
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));