Проблемы кодировки trackback и ее решение
Одной из проблем 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, как это и положенно.
Исправления займут всего одну строчку кода
.
Открываем файл 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!
- Встраивание html-счетчиков в WordPress
- Как публиковать свои посты, чтобы читать их было удобно
- Для чего подходит и не подходит WordPress
- Отображение виджетов в сайдбарах при разных условиях
- О кодировке WordPress
- Форма обратной связи
- WordPress 2.3.3 MaxSite Edition
- Пишем в блог с помощью Google
- Каким должен быть идеальный WordPress
- Какая должна быть CMS или почему WordPress?
- Анализатор кода phpXplorer
- Подчищаем таблицу опций
- Эксперимент с антиспам-картинкой
- К вопросу о кодировке WordPress
- Возвращаясь к вопросу кодировки






тест
тест
...
Наши с барсеткой
«Удивительное дело. Я все время удивляюсь тому, что заграницей, даже в самый час пик в метро – в Париже или в любом немецком городе – почем...
[...] Вообщем - то неплохо ты решил ненавистников win-1251 проучить. http://maxsite.org/27.html « Правильный транслит, какой? [...]
(исправленный мной)
[...] Отличная статья, помогающая настроить корректное отображение trackback’ов при различных кодировках блогов. Читаем на maxsite.org. [...]
Супер статья!
трэкбэк проверка
этот файл просто в wp-includes кидать, или что-то с ним надо делать?
Просто заменить wp-trackback.php
а вот такой вопрос: как настроить кросспостинг из wordpress с кодировкой win-1251 в ЖЖ с кодировкой в UTF-8?
Наверное нужно смотреть плагин (или через, что там отправляется). Перед отправкой конвертировать данные для ЖЖ отдельно.
UTF-8
Как думаете,мне следует переходить c win-1251 на UTF-8?
Имхо переход-дело геморное…
...
Ты сам за себя должен думать. :neutral:
Пока же всё нормально взаимодействует.
Максимум,если ты мне писал,то спешу заметить: У меня блог на UTF-8
Ну и, что дальше, мой чтоли блог, чтобы тебе указывать, такую или такую ставить кодировку. :mrgreen:
А я тебя и не спрашивал,пардон :razz:
Это ты на трэкбек ответил))