fwrite()
не является бинарно-безопасным. Это означает, что ваши данные - будь они правильно закодированы или нет - могут быть искажены этой командой или ее подпрограммами.
Чтобы быть в безопасности, вы должны использовать fopen()
с флагом двоичного режима. это b
. После этого fwrite()
сохранит ваши строковые данные «как есть», то есть в PHP до сих пор двоичные данные, потому что строки в PHP - это двоичные строки.
Справочная информация: Некоторые системы отличаются между текстовыми и двоичными данными. Бинарный флаг будет явно указывать PHP в таких системах использовать двоичный вывод. Когда вы имеете дело с UTF-8, вы должны позаботиться о том, чтобы данные не обрабатывались. Это предотвращается обработкой строковых данных как двоичных данных.
Однако: Если это не так, как вы сказали в своем вопросе, что кодировка данных в кодировке UTF-8 сохранена, то ваша кодировка будет нарушена, и даже двоичная безопасная обработка сохранит нарушенный статус. Тем не менее, с двоичным флагом вы по-прежнему гарантируете, что это не та часть вашего приложения, которая нарушает работу fwrite()
.
В другом ответе по праву написано, что вы не знаете кодировку, если у вас есть только данные. Тем не менее, вы можете проверить данные, если они проверяют кодировку UTF-8 или нет, поэтому у вас есть хоть какой-то шанс проверить кодировку. Функция в PHP, которая делает это, я опубликовала в выпущенном вопросе UTF-8, так что она может быть полезна вам, если вам нужно отладить вещи: Ответ: SimpleXML и китайский ищите can_be_valid_utf8_statemachine , это название функции.