Вывод XML в PHP (UTF-8)

Я следую этому руководству, чтобы внедрить карты Google на свою веб-страницу:

https://developers.google.com/maps/articles/phpsqlajax_v3#createtable

Все прошло идеально с моим подключением к базе данных. Информация в моей базе данных содержит такие символы, как "á,é,í"

Когда я пытаюсь проверить файл XML в браузере, возникает эта ошибка:

Эта страница содержит следующие ошибки:

ошибка в строке 1 в столбце 10: ошибка кодирования. Ниже приведен рендеринг страницы до первой ошибки.

На карте данные отображаются как: Богот�. Столица Колумбии. вместо: Богота.

Спасибо за совет!


person Seph1603    schedule 30.03.2015    source источник
comment
stackoverflow.com/questions/4164719/utf- 8-кодирование-xml-в-php   -  person s.d.a.p.e    schedule 30.03.2015
comment
Покажите нам, как вы подключаетесь к базе данных и извлекаете данные.   -  person user4035    schedule 30.03.2015
comment
header("Content-Type: application/xml; charset=utf-8"); для внешнего интерфейса   -  person s.d.a.p.e    schedule 30.03.2015
comment
привет, спасибо за ваш комментарий. Я уже пробовал header(Content-Type: text/xml; charset=utf-8); и до сих пор не работает.   -  person Seph1603    schedule 30.03.2015
comment
Я использовал эту функцию utf8_encode, и она работает, спасибо   -  person Seph1603    schedule 30.03.2015
comment
Нам нужно посмотреть, как вы подключаетесь к базе данных. И какие команды SQL использовались для вставки/выбора этих данных. Вероятно, у вас было что-то по умолчанию CHARACTER SET latin1 вместо utf8.   -  person Rick James    schedule 30.03.2015
comment
используйте utf8_encode utf8_decode в файле xml, возможно, это поможет, например, echo utf8_decode(file_get_contents(path)); и БД, возможно, GOOGLE: MYSQL SET NAMES   -  person s.d.a.p.e    schedule 30.03.2015
comment
Но вам нужно больше углубиться в тему ENCODING: соединение с базой данных, кодирование вывода, кодирование xml ... и как они работают вместе   -  person s.d.a.p.e    schedule 30.03.2015
comment
Спасибо, теперь это работает: echo 'datos=' . utf8_encode($строка['датос']) . ' ';   -  person Seph1603    schedule 30.03.2015


Ответы (1)


Все прошло идеально с моим подключением к базе данных. Информация в моей базе данных содержит такие символы, как "á,é,í"

Обратите внимание на мелкие детали здесь:

С одной стороны вы пишете

Все прошло идеально с моим подключением к базе данных.

А на другом пишешь:

Информация в моей базе данных содержит такие символы, как "á,é,í"

Итак, я пытаюсь показать здесь, что соединение с базой данных не является базой данных:

[PHP code] <--- database connection ---> [database server]-+-[data]

Соединение с базой данных — это согласование потока данных между сервером и вашей программой.

Кодирование — это метаинформация, и где бы вы ни передавали данные (строки), эта метаинформация о кодировании либо верна, либо неверна.

Когда это неправильно, это может привести к неожиданным результатам. Результаты, которые вы испытываете:

Богот. Столица Колумбии.

(вместо "Богота. Столица Колумбии".)

По своему опыту могу сказать вам следующее об этой более широкой картине:

  1. То, что браузер дает вам символ �, является признаком того, что он поймал двоичную последовательность данных, которая не может сделать из нее допустимую кодовую точку (скажем, букву) и красиво отобразить эту букву. Вместо этого он отображает вопросительный знак в ромбе, чтобы сигнализировать о проблеме.
  2. Это признак того, что кодировка Unicode ожидалась, а не дана.
  3. По опыту вы подаете однобайтовый набор символов как UTF-8.

Тому может быть несколько причин.

Итак, давайте вспомним, что я только что написал выше о метаданных рядом с самими данными, и рассмотрим подключение к базе данных:

[PHP code] <--- database connection ---> [database server]-+-[data]

И, прежде всего, хорошие новости: подключение к базе данных позволяет вам, как программисту PHP-кода, сообщать базе данных, какую кодировку вы ожидаете.

Затем сервер базы данных просматривает данные, которые у него есть, когда вы запрашиваете у него данные, и кодирует данные в запрошенной вами кодировке. Разве это не мило?

Поэтому все, что вам нужно сделать, это сообщить серверу базы данных, какую кодировку символов вы ожидаете.

Для этого вам нужно знать, с какой кодировкой символов вы будете обслуживать ответ. В настоящее время это чаще всего UTF-8 в Интернете. Поэтому скажите серверу базы данных, что вам нужна UTF-8. И все должно быть хорошо:

Редактировать: И, увидев ваши комментарии: Нет, вы добавили туда вызовы utf8_encode без необходимости. База данных может предоставить вам уже правильно закодированные данные (и всегда правильные). utf8_encode работает только для строк в кодировке Latin-1, он не будет работать, если у вас есть данные, отличные от базы данных. Не делайте это слишком конкретным, вместо этого просто используйте правильные параметры для подключения к базе данных, и у вас будет гораздо меньше поводов для беспокойства, потому что вы знаете, какую кодировку вы запросили.

Важный принцип: по возможности просите то, что хотите, вместо того, чтобы создавать это самостоятельно.

person hakre    schedule 30.03.2015