Я немного покопался и нашел ICU unorm2_normalize () документацию .Его параметр pErrorCode out интересен.Стандартные коды ошибок ICU начинаются около строки 620 utypes.h .Итак, я попробовал этот тестовый скрипт:
$s = 'tête-à-tête';
echo "normalizer_normalize(\$s) >> "
. var_export(normalizer_normalize($s), 1) . "\n";
$s = "\xFF" . $s;
echo "normalizer_normalize(\$s) >> "
. var_export($r=normalizer_normalize($s), 1) . "\n";
if ($r===false)
echo "normalizer_normalize() error: "
. intl_get_error_message() . "\n";
// which outputs:
normalizer_normalize($s) >> 'tête-à-tête'
normalizer_normalize($s) >> false
normalizer_normalize() error: Error converting input string to UTF-16: U_INVALID_CHAR_FOUND
Итак, я думаю, что тест, основанный на этом и поиск следующих трех кодов ошибок, будет приличным признаком плохой кодировки UTF-8:
U_INVALID_CHAR_FOUND Преобразование символов: не отображаемая последовательность ввода.U_TRUNCATED_CHAR_FOUND Преобразование символов: неполная последовательность ввода.U_ILLEGAL_CHAR_FOUND Преобразование символов: Неверная последовательность ввода / комбинация единиц ввода.
Или, когда мне лень, я могу просто использовать
normalizer_normalize($s)===false
Кстати: я смущенстрока спецификации API ICU:
pErrorCode Стандартный код ошибки ICU.Его входное значение должно пройти тест U_SUCCESS (), иначе функция вернется немедленно.Проверьте U_FAILURE () на выходе или используйте с функциональной цепочкой.(Подробнее см. В Руководстве пользователя.)
Фраза "функция немедленно возвращается" стимулирует выполнение моего теста, но относится ли "функция" к unorm2_normalize () или U_SUCCESS ()?Есть идеи?