Здравствуйте, Перенес сайт с PHP 7.4 на PHP 8.1 и функция iconv() перестала работать. Ошибка следующая: <b>Warning</b>: iconv(): Wrong encoding, conversion from "utf-8" to "windows-1251" is not allowed in <b>/web/action/gen.php</b> on line <b>104</b><br /> Подскажите как выяснить причину?
Добрый день! Вот, что произойдёт с iconv и для сравнения с mb_convert_encoding, если попадётся символ, отсутствующий в 1251 PHP: <? error_reporting(E_ALL); ini_set( 'default_charset', 'windows-1251' ); echo "PHP Version: ", phpversion(),"<br>"; $str = "Привет из Münchenа!"; echo iconv("utf-8", "windows-1251", $str),"<br>"; echo mb_convert_encoding($str, "windows-1251", "utf-8"),"<br>"; /* PHP Version: 8.1.9 Notice: iconv(): Detected an illegal character in input string in ........ on line 6 Привет из M?nchenа! */ ?> В этом случае не выдётся "iconv(): Wrong encoding, conversion from... " Попробуйте заменить на iconv на mb_convert_encoding Удачи!
Ну, значит, не в версии PHP дело, а в подаваемых для перекодирования данных. Они таки Wrong encoding, то есть не в UTF-8
Мы ведь не ядерной физикой занимаемся. Нам для проверки гипотиз синхрофазатроны не нужны. записал подаваемые для перекодирования данных в кодировке ISO-8859-1, однако таки сообщение не Wrong encoding... PHP: <? error_reporting(E_ALL); ini_set( 'default_charset', 'windows-1251' ); echo "PHP Version: ", phpversion(),"<br>"; //$str = "Привет из Münchenа!"; $str = file_get_contents("testWestern8859-1.txt"); //München в ISO 8859-1 echo mb_detect_encoding($str,['ASCII', 'UTF-8', 'ISO-8859-1','WINDOWS-1251'])," $str<br>"; echo iconv("utf-8", "windows-1251", $str),"<br>"; echo mb_convert_encoding($str, "windows-1251", "utf-8"),"<br>"; /* PHP Version: 8.1.9 ISO-8859-1 Mьnchen Notice: iconv(): Detected an illegal character in input string in ...... on line 8 M?nchen */ ?> Может быть Wrong encoding... означает, iconv не находит кодировку указанную в параметрах вызыва?
Данный вариант работает вроде: PHP: echo mb_convert_encoding($str, "windows-1251", "utf-8") Ранее, по своей глупости, я перепутал кодировки местами, поставив их в порядке как для iconv. Спасибо за помощь!
Гипотеза: Может быть Wrong encoding... означает, iconv не находит кодировку указанную в параметрах вызова? PHP: <? error_reporting(E_ALL); ini_set( 'default_charset', 'windows-1251' ); echo "PHP Version: ", phpversion(),"<br>"; $str = file_get_contents("testWestern8859-1.txt"); //München в ISO 8859-1 echo mb_detect_encoding($str,['ASCII', 'UTF-8', 'ISO-8859-1','WINDOWS-1251'])," $str<br>"; echo iconv("utf-8", "windows1251", $str),"<br>"; echo mb_convert_encoding($str, "windows-1251", "utf-8"),"<br>"; /* PHP Version: 8.1.9 ISO-8859-1 Mьnchen Warning: iconv(): Wrong encoding, conversion from "utf-8" to "windows1251" is not allowed ... on line 8 M?nchen */ ?>
.Наверное. UTF-8 - имя, utf-8 - псевдоним. Список поддерживаемых кодировок(и их псевдонимов) зависит от реализации libiconv То есть, если раньше вместо CP1251 было достаточно написать 1251, то с какого-то момента разработчики решили это дело прекратить
Вы правы по поводу libiconv Специально задал параметр windows1251 вместо windows-1251 и получил ту же ошибку, что у Mick_20. Однако у него параметры заданы верно. Из этого следует, что проблема в libiconv, т.е. в PHP, а не в параметрах и/или в данных. В моём случае проблем нет. phpinfo выдаёт: iconv support enabled iconv implementation "libiconv" iconv library version 1.16 интересно, какая версия libiconv у Mick_20