я использую iconv()
конвертировать данные CSV из UTF-8, в Windows-1252.
$converted = iconv("UTF-8", "Windows-1252", $csvData);
В некоторых случаях, iconv()
тихо провалился, возвращаясь false
,
Я также пытался использовать //TRANSLIT
но `iconv () ´ возвращается ложный и здесь.
Когда я добавлю //IGNORE
Оператор преобразуется в целевую кодировку, но это означает, что один или несколько символов были потеряны.
Я могу придерживаться //IGNORE
но я хотел бы выяснить, какие символы вызывают проблемы.
Как я могу это сделать?
Было плохой идеей работать со строкой как массивом символов (см. Комментарии к вопросу), потому что тип строки 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"
Постскриптум В следующий раз я дам более подробный ответ с кодом. Виноват
Других решений пока нет …