Я создаю файл, используя php fwrite (), и я знаю, что все мои данные находятся в UTF8 (я провел обширное тестирование на этом – при сохранении данных на db и выводе на обычной веб-странице все отлично работает и сообщается как utf8.), Но я Мне сообщили, что файл, который я выводил, содержит не utf8-данные 🙁 Есть ли команда в bash (CentOS), чтобы проверить формат файла?
При использовании vim он отображает содержимое как:
Donâ ~ @ ~ Yt делать все …. Itâ ~ @ ~ Ys отличный сайт со всем …. Weâ ~ @ ~ И только только что запустил /
Любая помощь будет оценена: либо подтверждение файла – UTF8, либо как написать содержимое utf8 в файл.
ОБНОВИТЬ
Чтобы уточнить, как я знаю, у меня есть данные в UTF8, я сделал следующее:
к базе данных Я запускаю это сначала:
$enc = mb_detect_encoding($data);
$data = mb_convert_encoding($data, "UTF-8", $enc);
Как раз перед тем, как я запустил 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, данные были правильными, но программа чтения файлов (внешнее приложение) не смогла правильно прочитать файл без спецификации