За последние 24 часа нас посетили 18444 программиста и 1668 роботов. Сейчас ищут 1169 программистов ...

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

Тема в разделе "PHP для новичков", создана пользователем Mick_20, 17 ноя 2023.

Метки:
  1. Mick_20

    Mick_20 Активный пользователь

    С нами с:
    10 дек 2012
    Сообщения:
    19
    Симпатии:
    1
    Адрес:
    Россия, Новосибирск
    Здравствуйте,

    Перенес сайт с 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 />

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

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.484
    Симпатии:
    281
    Возможно, попался символ, отсутствующий в 1251
    Замените to на 1251//IGNORE
     
    Mick_20 нравится это.
  3. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    425
    Симпатии:
    79
    Адрес:
    Бавария, Германия
    Добрый день!
    Вот, что произойдёт с 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
    Удачи!
     
    #3 Vladimir Kheifets, 17 ноя 2023
    Последнее редактирование: 17 ноя 2023
    Mick_20 нравится это.
  4. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.484
    Симпатии:
    281
    Ну, значит, не в версии PHP дело, а в подаваемых для перекодирования данных. Они таки Wrong encoding, то есть не в UTF-8
     
    Mick_20 нравится это.
  5. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    425
    Симпатии:
    79
    Адрес:
    Бавария, Германия
    Мы ведь не ядерной физикой занимаемся. Нам для проверки гипотиз синхрофазатроны не нужны.
    записал подаваемые для перекодирования данных в кодировке 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 не находит кодировку указанную в параметрах вызыва?


     
    Mick_20 нравится это.
  6. Mick_20

    Mick_20 Активный пользователь

    С нами с:
    10 дек 2012
    Сообщения:
    19
    Симпатии:
    1
    Адрес:
    Россия, Новосибирск
    Данный вариант работает вроде:
    PHP:
    1. echo mb_convert_encoding($str, "windows-1251", "utf-8")
    Ранее, по своей глупости, я перепутал кодировки местами, поставив их в порядке как для iconv.

    Спасибо за помощь!
     
    artoodetoo нравится это.
  7. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    914
    Симпатии:
    143
    @Mick_20, да, есть некоторый набор ф-ций у PHP, в которых чахорда с параметрами (
     
  8. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.484
    Симпатии:
    281
    Не нужны, подтверждаю. Достаточно проверить входные данные и правописание имен кодировок.
     
  9. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    425
    Симпатии:
    79
    Адрес:
    Бавария, Германия
    Гипотеза: Может быть 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. ?>
     
  10. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.484
    Симпатии:
    281
    .Наверное.
    UTF-8 - имя, utf-8 - псевдоним.
    Список поддерживаемых кодировок(и их псевдонимов) зависит от реализации libiconv
    То есть, если раньше вместо CP1251 было достаточно написать 1251, то с какого-то момента разработчики решили это дело прекратить
     
    #10 Drunkenmunky, 19 ноя 2023
    Последнее редактирование: 19 ноя 2023
  11. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    425
    Симпатии:
    79
    Адрес:
    Бавария, Германия
    Вы правы по поводу libiconv
    Специально задал параметр windows1251 вместо windows-1251 и получил ту же ошибку, что у Mick_20.
    Однако у него параметры заданы верно. Из этого следует, что проблема в libiconv, т.е. в PHP, а не в параметрах и/или в данных.
    В моём случае проблем нет. phpinfo выдаёт:
    iconv support enabled
    iconv implementation "libiconv"
    iconv library version 1.16

    интересно, какая версия libiconv у Mick_20
     
  12. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    914
    Симпатии:
    143
    Вроде бы разобрались, что лучше mb-либу юзать.