fwrite () и UTF8

Я создаю файл, используя php fwrite (), и я знаю, что все мои данные находятся в UTF8 (я провел обширное тестирование на этом – при сохранении данных на db и выводе на обычной веб-странице все отлично работает и сообщается как utf8.), Но я Мне сообщили, что файл, который я выводил, содержит не utf8-данные 🙁 Есть ли команда в bash (CentOS), чтобы проверить формат файла?

При использовании vim он отображает содержимое как:

Donâ ~ @ ~ Yt делать все …. Itâ ~ @ ~ Ys отличный сайт со всем …. Weâ ~ @ ~ И только только что запустил /

Любая помощь будет оценена: либо подтверждение файла – UTF8, либо как написать содержимое utf8 в файл.

ОБНОВИТЬ

Чтобы уточнить, как я знаю, у меня есть данные в UTF8, я сделал следующее:

  1. DB устанавливается на utf8 При сохранении данных
  2. к базе данных Я запускаю это сначала:

    $enc = mb_detect_encoding($data);

    $data = mb_convert_encoding($data, "UTF-8", $enc);

  3. Как раз перед тем, как я запустил fwrite, я проверил данные с примечанием. Каждая часть данных возвращает «IS utf-8»

    if (strlen($data)==mb_strlen($data, 'UTF-8')) print 'NOT UTF-8'; else print 'IS utf-8';

Благодаря!

Если вы знаете, что данные находятся в UTF8, то вы хотите настроить заголовок.

Я написал решение, отвечающее на другой шаг.

Решение состоит в следующем: поскольку знак байта UTF-8 равен \xef\xbb\xbf мы должны добавить его в заголовок документа.

 <?php function writeStringToFile($file, $string){ $f=fopen($file, "wb"); $file="\xEF\xBB\xBF".$file; // this is what makes the magic fputs($f, $string); fclose($f); } ?> 

Вы можете адаптировать его к своему коду, в основном вы просто хотите убедиться, что вы пишете файл UTF8 (как вы сказали, знаете, что ваш контент закодирован в UTF8).

fwrite() не является бинарной безопасностью. Это означает, что ваши данные – будь они правильно закодированы или нет – могут быть искалечены этой командой или ее базовыми подпрограммами.

Чтобы быть в безопасности, вы должны использовать fopen() с флагом двоичного режима. это b . Впоследствии fwrite() сохранит ваши строковые данные «как есть», и это до сих пор находится в PHP двоичных данных, потому что строки в PHP являются двоичными строками.

Предпосылки: Некоторые системы различаются между текстовыми и двоичными данными. Бинарный флаг будет явно командовать PHP на таких системах, чтобы использовать двоичный вывод. Когда вы работаете с UTF-8, вы должны позаботиться о том, чтобы данные не попадали в mangeled. Это предотвращается путем обработки строковых данных в виде двоичных данных.

Однако: если вы не сказали в своем вопросе, что кодировка данных UTF-8 сохраняется, то ваша кодировка будет нарушена, и даже двоичная безопасная обработка сохранит сломанный статус. Тем не менее, с бинарным флагом вы по-прежнему гарантируете, что это не часть fwrite() вашего приложения, которая нарушает работу.

Это было по праву написано в другом ответе здесь, что вы не знаете кодировку, если у вас есть только данные. Тем не менее, вы можете проверить данные, если он проверяет кодировку UTF-8 или нет, поэтому дает вам хотя бы некоторую возможность проверить кодировку. Функция в PHP, которая делает это, я опубликовал в выпуске UTF-8, поэтому он может вам пригодиться, если вам нужно отлаживать вещи: Ответ на: SimpleXML и китайский взгляд на can_be_valid_utf8_statemachine , это имя функции.

Проблема в том, что ваши данные закодированы в двойном формате. Я предполагаю, что ваш оригинальный текст выглядит примерно так:

  Не делай ничего 

с ' , т. е. не прямой апостроф, а правильный одинарный кавычек.

Если вы пишете скрипт PHP с этим контентом и закодированы в UTF-8:

 <?php //File in UTF-8 echo utf8_encode("Don't"); //this will double encode 

Вы получите что-то похожее на ваш результат.

 //add BOM to fix UTF-8 in Excel fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) )); 

Я нахожу, что эта штука работает для меня 🙂

I know all my data is in UTF8 – неправильные.
Кодирование – это не формат файла. Итак, проверьте кодировку в заголовках страницы, где вы берете данные из:
header("Content-type: text/html; charset=utf-8;");
И проверьте, действительно ли данные в многобайтовой кодировке:
if (strlen($data)==mb_strlen($data, 'UTF-8')) print 'not UTF-8';
else print 'utf-8';

Единственное, что мне нужно было сделать, это добавить в CSV спецификацию UTF8, данные были правильными, но программа чтения файлов (внешнее приложение) не смогла правильно прочитать файл без спецификации