Я использую 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 В следующий раз я дам более подробный ответ с кодом. Виноват