Обратите внимание, что вместо WordPress
лучше использовать современную и качественную
систему управления сайтом - MaxSite CMS!

Проблемы кодировки trackback и ее решение

1 апреля 2006 г. Просмотров: 8774 RSS 14
WordPress » Статьи

Одной из проблем WordPress'а является не совсем удачная реализация trackback'ов. Суть проблемы в том, что если два блога, имеющие разную кодировку пошлют друг другу trackback'и, то они опубликуют нечитабельный текст. А все дело в том, что когда WordPress посылает trackback, то он должен указывать и кодировку, в которой отправляет данные. Однако, WordPress не указывает charset. В этом все дело.

Принимающий блог должен каким-то образом определить кодировку поступающих данных. Для этого WordPress использует функцию mb_convert_encoding. Однако, эта PHP-функция включена только в версию PHP старше 4.0.6 в виде дополнительного расширения. Возможна ситуация, когда на сервере, PHP настроен без этого расширения. Именно поэтому WordPress предварительно проверяет существование mb_convert_encoding и лишь после этого производит конвертированние данных из одной кодировки в другую.

Функция mb_convert_encoding автоматически определяет кодировку данных из указаного диапазона и преобразует их в требуемую. Однако, разработчики WordPress, похоже не знают о существовании кодировки WINDOWS-1251, поскольку она попросту не указанна в списке возможных, поэтому, не зависимо от того, в какой кодировке у вас работает блог, есть смысл внести коррективы в WordPress.

(Дальше исправленная часть поста.)

Вот здесь я делаю «лирическое» отступление. После многочисленных экспериментов с функцией mb_convert_encoding выяснилось, что непосредственно конвертированием из одной кодировки в другую, функция выполняет нормально, во всяком случае преобразование UTF-8 в/из Windows-1251 происходят без ошибок.
Однако существует другая проблема. Дело в том, что mb_convert_encoding позволяет автоматически определить кодировку текста из указанного набора. И вот здесь, то и кроется подвох. Поскольку в UTF-8 могут присутствовать однобайтовые и многобайтовые символы, то надежно определить какая именно кодировка используется в тексте не получается. Еще одна встроенная функция mb_detect_encoding, которая и отвечает за определение кодировки, как раз и ошибается. Например, если указать набор из UTF-8 и WINDOWS-1251, то во всех случаях (при различных текстах) она возвращает UTF-8. (В Интернете часто встречается утверждения, что функции mb_... вообще не работают с WINDOWS-1251. Но это не так. Во всяком случае в php-библиотеке указана эта кодировка.)
Побродив по Интернету мне удалось найти функцию, которая достаточно надежно определяет использование в тексте кодировки UTF-8. То есть, теперь можно предварительно проверять входящий текст trackback'а на принадлежность UTF-8 и дальше, с помощью mb_convert_encoding, преобразовывать в кодировку блога.

Итак, если вы хотите повысить надежность определения кодировки Windows-1251 и UTF-8, то вам нужно модифицировать функции trackback. Сразу же привожу готовые файлы, если есть желание, то вы можете самостоятельно их проанализировать. Скажу только, что «определитель» работает так:

  • Первым делом смотрится указан ли charset. Если указан, то происходит конвертирование входящего текста в кодировку блога. (Однако WordPress не указывает charset - об этом чуть ниже.)
  • Если же charset не указан, то анализируется текст сообщения (если пусто, то заголовок) - определяется его принадлежность к UTF-8. В зависимости от анализа происходит (или не происходит) перекодирование в кодировку блога.

Но это лишь половинчатое решение. Возлагать всю ответственность на принимающий блог не совсем корректно. Отправляющий блог должен передавать и charset - то есть прямо указывать в какой кодировке отправляется текст. Анализ WordPress позволил определить, что он отправляет charset в http-заголовке xml-запроса, но вот при получении этот заголовок не анализируется. Собственно анализировать http-заголовок особого смысла нет, вместо этого нужно всего лишь добавить в текст xml-запроса поле charset, как это и положенно.

Исправления займут всего одну строчку кода smile.

Открываем файл wp-includes\functions.php. Примерно в середине находим function trackback и в ней такую строчку:

$query_string = "title=$title&url=$url&blog_name=$blog_name&excerpt=$excerpt";

Заменяем ее (все в одной строчке!):

$query_string = "title=$title&url=$url&blog_name=$blog_name&excerpt=$excerpt&
charset=" . get_settings('blog_charset');

Все! Теперь ваш блог при отправлении всегда будет указывать и кодировку - принимающая сторона всегда будет знать в каком виде вы отправили trackback!


twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru friendfeed.com google.com yandex.ru
Комментариев: 14
  1. 2006-04-02 в 12:01:38 | Мой Севастополь

    тест

    тест

    ...

  2. Наши с барсеткой

    «Удивительное дело. Я все время удивляюсь тому, что заграницей, даже в самый час пик в метро – в Париже или в любом немецком городе – почем...

  3. 2006-04-02 в 15:43:36 | Макс, маладес! - Журнал Максим

    [...] Вообщем - то неплохо ты решил ненавистников win-1251 проучить. http://maxsite.org/27.html « Правильный транслит, какой? [...]

    (исправленный мной)

  4. 2006-04-09 в 16:10:27 | записки пинги » Ресурсы сети. Введение.

    [...] Отличная статья, помогающая настроить корректное отображение trackback’ов при различных кодировках блогов. Читаем на maxsite.org. [...]

  5. Супер статья!

    трэкбэк проверка

  6. этот файл просто в wp-includes кидать, или что-то с ним надо делать?

  7. 2006-05-06 в 13:16:27 | Максим

    Просто заменить wp-trackback.php

  8. 2006-05-10 в 17:03:16 | Василь

    а вот такой вопрос: как настроить кросспостинг из wordpress с кодировкой win-1251 в ЖЖ с кодировкой в UTF-8?

  9. 2006-05-10 в 17:14:38 | Максим

    Наверное нужно смотреть плагин (или через, что там отправляется). Перед отправкой конвертировать данные для ЖЖ отдельно.

  10. 2006-06-03 в 17:27:25 | Foxhaund's Blog

    UTF-8

    Как думаете,мне следует переходить c win-1251 на UTF-8?

    Имхо переход-дело геморное…

    ...

  11. Ты сам за себя должен думать. :neutral:

    Пока же всё нормально взаимодействует.

  12. Максимум,если ты мне писал,то спешу заметить: У меня блог на UTF-8

  13. Ну и, что дальше, мой чтоли блог, чтобы тебе указывать, такую или такую ставить кодировку. :mrgreen:

  14. А я тебя и не спрашивал,пардон :razz:

    Это ты на трэкбек ответил))

Оставьте комментарий!

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

Комментарий будет опубликован после проверки

(войти без комментирования)

Имя и сайт используются только при регистрации

Авторизация: Loginza.

(обязательно)