php пытается получить ошибку, но только в том случае, если вы отключили display_errors от. Это нечетно, потому что параметр display_errors
предназначен только для контроля того, печатаются ли ошибки на стандартный вывод, а не при возникновении ошибки. Я хочу подчеркнуть, что когда у вас есть display_errors
, хотя вы можете видеть всевозможные другие ошибки php, php не просто скрывает эту ошибку, он даже не вызывает ее. Это означает, что он не будет отображаться в каких-либо журналах ошибок, и не будут вызваны какие-либо пользовательские error_handlers. Ошибка просто не возникает.
Вот код, который демонстрирует это:
error_reporting(-1);//report all errors
$invalid_utf8_char = chr(193);
ini_set('display_errors', 1);//display errors to standard output
var_dump(json_encode($invalid_utf8_char));
var_dump(error_get_last());//nothing
ini_set('display_errors', 0);//do not display errors to standard output
var_dump(json_encode($invalid_utf8_char));
var_dump(error_get_last());// json_encode(): Invalid UTF-8 sequence in argument
Это странно и прискорбно поведение связано с этой ошибкой https://bugs.php.net/bug.php?id=47494 и несколько других, и не похоже, что это никогда не будет исправлена.
обходной путь:
Очистка строки перед передачей его в json_encode может быть приемлемым решением.
$stripped_of_invalid_utf8_chars_string = iconv('UTF-8', 'UTF-8//IGNORE', $orig_string);
if ($stripped_of_invalid_utf8_chars_string !== $orig_string) {
// one or more chars were invalid, and so they were stripped out.
// if you need to know where in the string the first stripped character was,
// then see http://stackoverflow.com/questions/7475437/find-first-character-that-is-different-between-two-strings
}
$json = json_encode($stripped_of_invalid_utf8_chars_string);
http://php.net/manual/en/function.iconv.php
Руководство говорит
//IGNORE
молча отбрасывает символы, которые являются незаконными в целевом кодировкой.
Итак, сначала удалив проблемные символы, теоретически json_encode() не должен ничего что-либо задушить и не сработает. Я не подтвердил, что вывод iconv с флагом //IGNORE
прекрасно совместим с понятием json_encodes о том, какие действительные символы utf8 есть, поэтому покупатель остерегается ... так как могут быть крайние случаи, когда он все еще не работает. Я ненавижу проблемы с набором символов.
Является ли строка '' Düsseldorf '' недействительной только тогда, когда вы 'utf8_decode()' it? –
@Matt нет, это был просто пример создания сломанной строки для ответчиков для тестирования –
Итак, вы получаете некоторые данные JSON, которые могут содержать недопустимые строки UTF-8? – Gumbo