Не работать функция iconv()

Здравствуйте,

Перенес сайт с PHP 7.4 на PHP 8.1 и функция iconv() перестала работать.
Ошибка следующая:

<b>Warning</b>: iconv(): Wrong encoding, conversion from &quot;utf-8&quot; to &quot;windows-1251&quot; is not allowed in <b>/web/action/gen.php</b> on line <b>104</b><br />

Подскажите как выяснить причину?

 

Возможно, попался символ, отсутствующий в 1251
Замените to на 1251//IGNORE

 

Добрый день!
Вот, что произойдёт с iconv и для сравнения с mb_convert_encoding,
если попадётся символ, отсутствующий в 1251

PHP:
  1. <?
  2.     error_reporting(E_ALL);
  3.     ini_set( ‘default_charset’, ‘windows-1251’ );
  4.     echo «PHP Version: «, phpversion(),«<br>»;
  5.     $str = «Привет из Münchenа!»;
  6.     echo iconv(«utf-8», «windows-1251», $str),«<br>»;
  7.     echo mb_convert_encoding($str, «windows-1251», «utf-8»),«<br>»;
  8.     /*
  9.     PHP Version: 8.1.9
  10.     Notice: iconv(): Detected an illegal character in input string in …….. on line 6
  11.     Привет из M?nchenа!
  12.     */
  13. ?>

В этом случае не выдётся «iconv(): Wrong encoding, conversion from… «
Попробуйте заменить на iconv на mb_convert_encoding
Удачи!

 

Ну, значит, не в версии PHP дело, а в подаваемых для перекодирования данных. Они таки Wrong encoding, то есть не в UTF-8

 

Мы ведь не ядерной физикой занимаемся. Нам для проверки гипотиз синхрофазатроны не нужны.
записал подаваемые для перекодирования данных в кодировке ISO-8859-1, однако таки сообщение не Wrong encoding…

PHP:
  1. <?
  2.     error_reporting(E_ALL);
  3.     ini_set( ‘default_charset’, ‘windows-1251’ );
  4.     echo «PHP Version: «, phpversion(),«<br>»;
  5.     //$str = «Привет из Münchenа!»;
  6.     $str = file_get_contents(«testWestern8859-1.txt»); //München в ISO 8859-1
  7.     echo mb_detect_encoding($str,[‘ASCII’, ‘UTF-8’, ‘ISO-8859-1’,‘WINDOWS-1251’]),» $str<br>»;
  8.     echo iconv(«utf-8», «windows-1251», $str),«<br>»;
  9.     echo mb_convert_encoding($str, «windows-1251», «utf-8»),«<br>»;
  10.     /*
  11.     PHP Version: 8.1.9
  12.     ISO-8859-1 Mьnchen
  13.     Notice: iconv(): Detected an illegal character in input string in …… on line 8
  14.     M?nchen
  15.     */
  16. ?>

Может быть Wrong encoding… означает, iconv не находит кодировку указанную в параметрах вызыва?


 

Данный вариант работает вроде:

PHP:
  1. echo mb_convert_encoding($str, «windows-1251», «utf-8»)

Ранее, по своей глупости, я перепутал кодировки местами, поставив их в порядке как для iconv.

Спасибо за помощь!

 

@Mick_20, да, есть некоторый набор ф-ций у PHP, в которых чахорда с параметрами (

 

Не нужны, подтверждаю. Достаточно проверить входные данные и правописание имен кодировок.

 

Гипотеза: Может быть Wrong encoding… означает, iconv не находит кодировку указанную в параметрах вызова?

PHP:
  1. <?
  2.     error_reporting(E_ALL);
  3.     ini_set( ‘default_charset’, ‘windows-1251’ );
  4.     echo «PHP Version: «, phpversion(),«<br>»;  
  5.     $str = file_get_contents(«testWestern8859-1.txt»); //München в ISO 8859-1
  6.     echo mb_detect_encoding($str,[‘ASCII’, ‘UTF-8’, ‘ISO-8859-1’,‘WINDOWS-1251’]),» $str<br>»;
  7.     echo iconv(«utf-8», «windows1251», $str),«<br>»;
  8.     echo mb_convert_encoding($str, «windows-1251», «utf-8»),«<br>»;
  9.     /*
  10.     PHP Version: 8.1.9
  11.     ISO-8859-1 Mьnchen
  12.     Warning: iconv(): Wrong encoding, conversion from «utf-8» to «windows1251» is not allowed … on line 8
  13.     M?nchen
  14.     */
  15. ?>
 

.Наверное.
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

 

Вроде бы разобрались, что лучше mb-либу юзать.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *