умные цитаты не конвертируются должным образом в UTF8 - PullRequest
3 голосов
/ 22 февраля 2012

У меня есть PHP-скрипт, который импортирует и анализирует XML-файлы и сохраняет данные в базе данных:

  • Сортировка базы данных: utf8_general_ci, кодировка: utf8
  • Кодировка страницы: utf-8
  • XML-файлы: ANSI, содержит умные кавычки (из MS Word)

Поэтому во время импорта я делаю utf8_encode() для текста из файлов XML перед сохранением в базе данных и последующим отображением на странице.

Но при успешном импорте и сохранении в БД,

  • База данных: умные кавычки сохраняются как ? символ (при просмотре из CMD)
  • Страница: умные кавычки отображаются в виде полей

Любые идеи относительно того, почему умные кавычки не конвертируются правильно, даже при использовании utf8_encode()?

EDIT:

@ Tomalak: XML-файлы на самом деле .txt, без декларации XML (<?xml ... ?>) и без корневого элемента. Мой скрипт фактически добавляет корневой элемент только для того, чтобы синтаксический анализатор работал:

utf8_encode('<article>' . file_get_contents($xmlfile) . '</article>');

Похоже, мне нужно добавить объявление XML ..? Если так, как это должно выглядеть?

Ответы [ 2 ]

6 голосов
/ 22 февраля 2012

Если ваша строка XML (то есть содержимое файла) имеет значение , а не , закодированное как UTF-8, вам необходимо объявление XML, которое обозначает кодировку файла. Если декларация XML отсутствует, синтаксический анализатор примет UTF-8.

Пока вы не используете «специальные» символы (т.е. что-либо вне диапазона ASCII), он будет работать без объявления, даже если ваш файл не действительно в кодировке UTF-8. Это потому, что UTF-8 является байтово-совместимым с ASCII. Но как только используются символы, которые находятся на одной из кодовых страниц - например, «умные кавычки» - они прерываются, потому что они представлены различными байтами в UTF-8.

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

'<?xml encoding="Windows-1252"?><article>'.file_get_contents($xmlfile).'</article>'

Таким образом, вы указываете DOMDocument, как интерпретировать байты в вашей строке. Я предположил Windows-1252 для вас, потому что вы сказали ANSI и упомянули фигурные кавычки.

На самом деле, 95% времени это то, что на самом деле имеют в виду люди, даже на Linux и даже если они говорят ISO-8859-1 (или latin-1), что почти, но не точно то же самое.

Чтобы быть уверенным, что вы можете открыть свои текстовые файлы в шестнадцатеричном редакторе, найдите несколько специальных символов и сравните их значения в байтах с предполагаемой кодировкой. Для Windows-1252. Для фигурных кавычек ожидаемые значения байтов будут:

  • 147 (0x93)
  • 148 (0x94)

Как только значение отдельных байтов в вашей строке объявлено, DOMDocument может понять их и поступить правильно.

Когда дело доходит до БД, я сильно подозреваю, что происходит некоторое автоматическое преобразование кодировки. Я признаю, что недостаточно знаю об интеграции PHP / mySQL / Unicode, чтобы сказать наверняка.

1 голос
/ 22 февраля 2012

Они конвертируются правильно, потому что utf8_encode делает именно то, что он должен делать, и удаляет их из входного потока.

utf8_encode преобразует текст в ISO-8859-1 в кодировку UTF-8.ISO-8859-1 не содержит символов умных цитат.Ваша веб-страница, вероятно, рассматривается как кодировка MSWIN1252 в браузере, которая содержит символы умных цитат, и вы вводите PHP-код в ISO-8859-1, вызывая для него utf8_encode.Это означает, что единственными символами, которые попадут в вашу базу данных, являются следующие: http://en.wikipedia.org/wiki/ISO/IEC_8859-1#Codepage_layout

Чтобы решить эту проблему, вы должны убедиться, что сама веб-страница находится в кодировке UTF-8, и удалить всеutf8_encode / utf8_decode операторы из вашего кода.На этой странице объясняется, как правильно работать с UTF-8: http://malevolent.com/weblog/archive/2007/03/12/unicode-utf8-php-mysql/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...