iconv () – как распознать оскорбительный характер?

Я использую iconv() для преобразования CSV-данных из UTF-8 в Windows-1252 .

 $converted = iconv("UTF-8", "Windows-1252", $csvData); 

В некоторых случаях iconv() не прошел спокойно, возвращая false .

Я также пытался использовать //TRANSLIT но `iconv () 'также возвращает false .

Когда я добавляю оператор //IGNORE в целевую кодировку, преобразование завершается успешно, но это означает, что один или несколько символов были потеряны.

Я могу придерживаться //IGNORE но я хотел бы узнать, какой символ (ы) вызывает проблему.

Как я могу это сделать?

Было плохой идеей работать со строкой в ​​виде массива char (см. Вопрос), потому что тип строки php

Внутренне строки PHP представляют собой байтовые массивы. В результате доступ или изменение строки с использованием скобок массива не является многобайтовым безопасным и должен выполняться только со строками, которые находятся в однобайтовой кодировке, такой как ISO-8859-1.

Поэтому мы можем использовать mb_substr для utf-8 и работать с символами, а не байтами

 error_reporting('E_ALL & !E_NOTICE'); $yourString = "test bad ☺ string"; $convertString = ''; $badChars = []; if (iconv("UTF-8", "Windows-1252", $yourString) === false) { for($i = 0, $stringLength = mb_strlen($yourString); $i < $stringLength; $i++) { $char = mb_substr($yourString, $i, 1); $convertChar = iconv("UTF-8", "Windows-1252", $char); if ($convertChar === false) { $badChars[$i] = $char; } else { $convertString .= $convertChar; } } } else { $convertString = iconv("UTF-8", "Windows-1252", $yourString); } var_dump($badChars, $convertString); 

array(1) { [9]=> string(3) "☺" } string(16) "test bad string" результатов array(1) { [9]=> string(3) "☺" } string(16) "test bad string"

PS В следующий раз я дам более подробный ответ с кодом. Виноват