Обнаружение, сохранение, вывод UTF8 с PHP - PullRequest
0 голосов
/ 14 июня 2011

У меня, как и у многих других разработчиков PHP, были проблемы с кодировкой символов, в этом вопросе будут изложены шаги, которые я выполняю, чтобы гарантировать, что мои данные будут сохранены и выведены в формате UTF8. Я хотел бы получить совет о том, что еще я должен рассмотреть и / или изменить в соответствии с моим текущим мышлением.

У меня есть база данных mysql DEFAULT CHARACTER UTF-8 мои таблицы имеют параметры сортировки utf8_general_ci

Я использую php-скрипт для чтения данных из RSS-канала, а затем сохраняю эти данные в базе данных. Прежде чем сохранить эти данные, я проверяю, являются ли эти данные UTF-8 или нет, выполнив следующие действия:

protected function _convertToUTF8($content) {
    $enc = mb_detect_encoding($content);
    return mb_convert_encoding($content, "UTF-8", $enc);
}

При выводе этих данных на веб-страницу я устанавливаю заголовки в php

header("Content-type: text/html; charset=utf-8");

и я также установил метатег Content-Type как utf-8

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

Пока все работает, как и ожидалось, я не получаю никаких забавных символов и все идет гладко, но я должен что-то менять / учитывать при работе с этими данными?

Проблема, с которой я сейчас сталкиваюсь, заключается в выводе этих данных в текстовый файл (csv). Я использую fwrite (), которая успешно создала файл, но третье лицо, которому я передаю этот файл, говорит, что файл не является UTF- 8. Я не уверен, что данные выводятся как UTF-8 , как я могу это проверить? Когда я захожу на удаленный сервер через SSH, и я вижу файл, я получаю Itâs a, когда я vim файл, я получаю Itâ~@~Ys, когда я меньше файла, я получаю It<E2><80><99>s. Что мне здесь не хватает?

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 14 июня 2011

Вы не можете обнаружить кодировку каких-либо данных. Кодировка - это всегда мета-информация рядом с самими данными.

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

Не надейся на это. Используйте его только для проверки вручную в случае, если вам нужно отладить проблему или в крайнем случае отступления, но никогда в стандартной обработке данных. Даже тогда, не доверяйте этой информации слишком много.

Как я могу так сказать? Просто пример: текст может быть корректно закодирован в US-ASCII, а процедура обнаружения для UTF-8 вернет, что он действительно закодирован в UTF-8. И это только один пример. Правда в том, что это намного сложнее.

Так что принимайте как должное, что вы не можете обнаружить кодировку из необработанных данных.

Вместо этого ищите метаинформацию, которая определяет кодировку. Если информация о кодировке не указана, найдите кодировку по умолчанию в документах спецификации для транспортировки данных.

В случае хранения данных из RSS-каналов ищите информацию либо в заголовках ответов, либо в прологе XML. Обычно он содержит кодировку в формате ISO документа.

Поскольку ваша база данных ожидает данные, закодированные как UTF-8, ваша обработка должна позаботиться о том, чтобы в базу данных помещались только данные UTF-8. Поэтому проверьте и получите кодировку данных, а затем выполните шаги, необходимые для изменения кодировки. Но не полагайтесь на mb_detect_encoding() для выполнения этих шагов.

0 голосов
/ 29 июня 2011

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

...