utf-8 и htmlentities в RSS-каналах - PullRequest
9 голосов
/ 21 ноября 2008

Я пишу несколько RSS-каналов на PHP и сталкиваюсь с проблемами кодировки символов. Должен ли я utf8_encode () до или после кодирования htmlentities ()? Например, у меня есть и амперсанды и китайские символы в элементе описания, и я не уверен, какой из них правильный:

$output = utf8_encode(htmlentities($source)); or
$output = htmlentities(utf8_encode($source));

А почему?

Ответы [ 6 ]

17 голосов
/ 21 ноября 2008

Важно передать набор символов в функцию htmlentities, так как по умолчанию ISO-8859-1:

utf8_encode(htmlentities($source,ENT_COMPAT,'utf-8'));

Сначала вы должны применить htmlentities, чтобы позволить utf8_encode правильно кодировать сущности.

(РЕДАКТИРОВАТЬ: я изменил свое мнение до того, что на основании комментариев порядок не имеет значения. Этот код протестирован и хорошо работает).

14 голосов
/ 26 января 2009

Первое: функция utf8_encode преобразуется из ISO 8859-1 в UTF-8. Так что вам нужна эта функция, только если ваша входная кодировка / кодировка соответствует ISO 8859-1. Но почему вы не используете UTF-8?

Второе: вам не нужно htmlentities. Вам просто нужно htmlspecialchars, чтобы заменить специальные символы ссылками на символы. htmlentities заменит «слишком много» символов, которые могут быть закодированы напрямую с использованием UTF-8. Важно то, что вы используете стиль цитаты ENT_QUOTES для замены одинарных кавычек.

Итак, мое предложение:

// if your input encoding is ISO 8859-1
htmlspecialchars(utf8_encode($string), ENT_QUOTES)

// if your input encoding is UTF-8
htmlspecialchars($string, ENT_QUOTES, 'UTF-8')
7 голосов
/ 27 ноября 2008

Не используйте htmlentities()!

Просто используйте символы UTF-8. Просто убедитесь, что вы объявили кодировку канала в заголовках HTTP (Content-Type:application/xml;charset=UTF-8) или не указали его в самом ленте, используя <?xml version="1.0" encoding="UTF-8"?> в первой строке.

2 голосов
/ 26 января 2009

Может быть проще забыть htmlentities и использовать раздел CDATA. Он работает для раздела заголовка, который не поддерживает закодированные символы HTML в программе просмотра RSS Firefox:

<title><![CDATA[News & Updates  " > » ☂ ☺ ☹ ☃  Test!]]></title>
1 голос
/ 21 ноября 2008

Вы хотите сделать $output = htmlentities(utf8_encode($source));. Это потому, что вы хотите сначала преобразовать свои международные символы в надлежащие UTF8, а затем превратить амперсанды (и, возможно, некоторые из символов UTF-8) в объекты HTML. Если вы сначала создаете объекты, то некоторые международные символы могут быть обработаны неправильно.

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

0 голосов
/ 23 мая 2009

После долгих проб и ошибок я наконец нашел способ правильно отобразить строку из значения базы данных в кодировке utf8 через файл xml на html-страницу:

$output = '<![CDATA['.utf8_encode(htmlentities($string)).']]>';

Надеюсь, это кому-нибудь поможет.

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