iconv () — как обнаружить оскорбительного персонажа?

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

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

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

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

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

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

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

0

Решение

Было плохой идеей работать со строкой как массивом символов (см. Комментарии к вопросу), потому что тип строки 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"

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector