Преобразование строки UTF-8 в UTF-8 с использованием iconv()
с использованием параметра //IGNORE
дает результат, при котором недопустимые символы UTF-8 удаляются.
Следовательно, вы можете обнаружить неработающий символ, сравнивая длину строки до и после операции iconv. Если они отличаются, они содержат неработающий символ.
Контрольный пример (убедитесь, что файл сохранен как UTF-8):
<?php
header("Content-type: text/html; charset=utf-8");
$teststring = "Düsseldorf";
// Deliberately create broken string
// by encoding the original string as ISO-8859-1
$teststring_broken = utf8_decode($teststring);
echo "Broken string: ".$teststring_broken ;
echo "<br>";
$teststring_converted = iconv("UTF-8", "UTF-8//IGNORE", $teststring_broken );
echo $teststring_converted;
echo "<br>";
if (strlen($teststring_converted) != strlen($teststring_broken ))
echo "The string contained an invalid character";
теоретически, вы можете отбросить //IGNORE
и просто проверить на неудачную (пустую) iconv
операцию, но могут быть и другие причины сбоя iconv, кроме просто недопустимых символов ... Я не знаю. Я бы использовал метод сравнения.