Странные символы - несмотря на использование UTF-8
Не понятно, почему эта тема была закрыта, но это та же проблема, с которой сталкиваются многие люди.
Все мои настройки WP в порядке:
//define('DB_CHARSET', 'utf8');
//define('DB_CHARSET', 'utf8_unicode_ci');
//define('DB_COLLATE', '');
Я даже пробовал включать их по одному. Ничего не помогло.
Когда я сохраняю пост, странные символы появляются вместо апострофов и пробелов. Это происходит независимо от того, ввожу ли я контент вручную или
Я попробовал несколько плагинов.
- UTF-8 Sanitize
- Convert WP to UTF-8
..и т.д.
Ни один из них не работает. Проблема остается.
Я также изменил набор символов и сопоставление базы данных в MySQL. Скриншот:
Это скриншот того, как я вставляю контент:
Но сразу после сохранения текст возвращается с искаженными символами:
Что еще?
Я прошел через процедуру дампа всей базы данных MySQL, затем удалил все старые не-utf8 символы с помощью команды TR.
tr -cd '\11\12\15\40-\176' < file-with-binary-chars > clean-file
Где file-with-binary-chars
был дампом MySQL. Затем я восстановил таблицу.
Моя конфигурация MySQL полностью в utf8:
[client]
default-character-set=utf8
[mysqld]
character-set-client=utf8
collation-server=utf8_unicode_ci
character-set-server=utf8
Мой браузер - Chrome. Кодировка UTF-8 (в меню ПРОСМОТР).
Что еще я могу сделать? Нужно ли также сделать все файлы плагинов в utf-8?
К сведению, этот блог является одним из блогов WordPress. На том же сервере есть другие более новые установки WordPress, использующие ту же установку MySQL 5.6.17, но у них нет такой проблемы. Я предполагаю, что поскольку это более старый блог, в нем могут быть некоторые вариации в тексте, введенном давно, но честно говоря, после того как я сделал все вышеперечисленное, я действительно не знаю, что еще можно сделать.
Спасибо за любые предложения или подсказки!
Обычно это происходит, когда вы копируете/вставляете текст из MS Word в редактор контента WordPress. WordPress использует так называемые "умные кавычки" с помощью функции wptexturize().
Идеальное решение
Идеальным решением будет пройтись по вашему контенту и заменить все одинарные/двойные кавычки, используя клавиатуру.
Однако, если вы работаете с большими объемами копируемого/вставляемого текста, это может быть нецелесообразно.
Отключение фильтра wptexturize()
Другой вариант - отключить фильтр wptexturize()
; это можно сделать, добавив следующий код в файл functions.php вашей дочерней темы:
remove_filter('the_content', 'wptexturize');
Вы также можете отключить фильтр для комментариев и/или анонсов:
remove_filter('comment_text', 'wptexturize');
remove_filter('the_excerpt', 'wptexturize');
Или для заголовков:
remove_filter ('single_post_title', 'wptexturize');
remove_filter ('the_title', 'wptexturize');
remove_filter ('wp_title', 'wptexturize');
Очистка базы данных
Для существующего контента, где "странные" символы уже сохранены в базе данных, вам может потребоваться очистить базу данных, выполнив следующие запросы через PHPMyAdmin (не забудьте сначала сделать резервную копию базы данных):
UPDATE wp_posts SET post_content = REPLACE(post_content, '“', '“');
UPDATE wp_posts SET post_content = REPLACE(post_content, 'â€', '”');
UPDATE wp_posts SET post_content = REPLACE(post_content, '’', '’');
UPDATE wp_posts SET post_content = REPLACE(post_content, '‘', '‘');
UPDATE wp_posts SET post_content = REPLACE(post_content, '—', '–');
UPDATE wp_posts SET post_content = REPLACE(post_content, '–', '—');
UPDATE wp_posts SET post_content = REPLACE(post_content, '•', '-');
UPDATE wp_posts SET post_content = REPLACE(post_content, '…', '…');
Плагины
Ну... это же WordPress. Вы всегда можете использовать плагин для управления фильтром wptexturize()
. Посмотрите этот список и выберите подходящий для вас.

Спасибо за этот очень информативный пост, и вы правы — кавычки действительно вызывают эти проблемы. Но дело не только в кавычках. Иногда даже пробелы до и после точки содержат эти странные символы. Во-вторых, очевидно, что-то где-то работает неправильно, потому что этого не происходит ни на одном другом блоге на том же самом сервере, использующем такую же базовую установку MySQL и всё остальное. Конфигурационные файлы тоже весьма похожи.

Это отлично сработало для меня. Одно замечание: я считаю, что лучше использовать utf8mb4_unicode_ci, основываясь на информации в этой статье. Как минимум, здесь хорошо изложены варианты, чтобы каждый мог сам принять решение.

Следующее решение помогло мне, поэтому публикую его здесь, чтобы поделиться. Несмотря на то, что я выполнил предложенные SQL-запросы, перед ссылками "читать далее" всё равно появлялись странные символы.
Я был совершенно шокирован. После нескольких часов проб и тестов я наконец нашёл в "Настройках" раздел "Чтение" и опцию ниже: "Кодировка для страниц и фидов". После изменения с UTF-7 на UTF-8 всё снова стало отображаться корректно.
И что ещё страннее - после изменения на UTF-8 эта опция исчезла со страницы. Согласно сайту WordPress, эта опция была удалена начиная с версии 3.5.

Проблема может быть вызвана плагинами и прямыми загрузками через FTP.
Подробности:

В моем случае странные символы не записывались в базу данных. Проверьте, отображаются ли некорректные символы и в сыром SQL-запросе. Если вы видите обычные апострофы в базе данных, закомментируйте следующие две строки в файле wp-config.php
:
// define('DB_CHARSET', 'utf8');
// define('DB_COLLATE', '');
Это сразу же решило проблему в моем случае.
"Эта проблема с кодировкой символов может возникнуть после обновления базы данных" - Ссылка
