Символы UTF8 не печатаются как таковые в HTML Drupals - PullRequest
1 голос
/ 29 июля 2010

Я пытаюсь отладить неприятную проблему utf-8 и не знаю, с чего начать.

На странице содержится слово «Категория» «n», которое должно быть «Категория». Очевидно, что-то не так с UTF-8. Это происходит со всеми этими многобитными персонажами. Я отсканировал темы из gazillion здесь, на UTF8, но они в основном охватывают основы, а не ту ситуацию, когда кажется, что все настроено и установлено правильно, но явно нет.

Страницы обслуживаются Drupal из базы данных MySQL.

База данных была перенесена (не мной) с помощью sql-dumping и -importing через phpmyadmin. Вероятно, что-то пошло не так, потому что раньше проблем не было. И потому что проблема возникает только на старых, импортированных предметов. Редактирование этих элементов или вставка новых, а также ручное исправление неправильно закодированных символов устраняет проблему. Хотя я не вижу разницы в базе данных.

  • Контент, отредактированный через Drupal, не имеет этой проблемы.
  • Когда в CLI, используя MySQL, я могу прочитать этот текст и получить правильный символ ë. Обе статьи, которые отображают «правильные» и «неправильные» символы.
  • В таблицах есть сопоставление utf8_general_ci
  • Заголовки, похоже, отправляются с правильной кодировкой: Vary Accept-Encoding и Content-Type text/html; charset=utf-8
  • HTML-заголовок содержит <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  • заголовки HTTP сообщают мне, что между ними есть прокси Varnish. Может ли это вызвать UTF8-преобразование / поломку
  • контент подается в Gzipped, нормальный в Drupal, и я никогда не видел этот UTF8 исси с gzipping, но вы никогда не знаете.

Похоже, виновником является импорт, и я хотел бы знать, а) что пошло не так б) почему я не вижу разницы в клиенте mysql cli между «неправильными» и «правильными» символами c) как исправить базу данных или с чего начать и узнать, как ее исправить.

Ответы [ 4 ]

4 голосов
/ 05 марта 2011

Файл дампа, вероятно, выводился как UTF-8, но при импорте интерпретировался как latin1.

ë, двухбайтовое представление latin1 для UTF-8 ë, физически находится в вашемТаблицы в виде данных UTF-8.

Учитывая, что у вас есть смесь нетронутых и поврежденных данных, это будет сложно исправить в общем виде, но обычно это грязный обходной путь * будет работать хорошо:

UPDATE table SET column = REPLACE("ë", "ë", column);

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

Смежные вопросы с той же проблемой:

* (конечно, не забудьте сделать резервные копии перед выполнением чего-либо подобного!)

0 голосов
/ 09 марта 2011

Чтобы быть абсолютно уверенным, что у вас есть utf8 от начала до конца:
- файлы исходного кода в utf8 без спецификации
- база данных с сопоставлением utf8
- таблицы базы данных с сопоставлением utf8
- подключение к базе данных в utf8 (запросить его с помощью 'SET CHARSET UTF8')
- заголовок страницы установлен в utf8 (тоже ajax) - метатег для установки страницы в utf8

0 голосов
/ 09 марта 2011

Вы упоминаете, что проблема может быть в импорте. В этом случае возможно, что во время импорта соединение с клиентом и сервером MySQL не использовало UTF-8. У меня была эта проблема пару раз в прошлом, поэтому я хотел бы поделиться с вами этими настройками MySQL (в my.conf):

В настройках сервера добавьте:

# UTF 8
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci
skip-character-set-client-handshake

А в настройках клиента добавьте:

default-character-set=utf8

Это может избавить вас от головной боли в следующий раз.

0 голосов
/ 07 марта 2011

Не должно быть ничего хорошего в экспорте и импорте дампа Drupal, если только человеку, делающему это, каким-то образом не удалось настроить экспорт как нечто иное, чем UTF8.Мы много экспортируем / импортируем дампы и никогда не сталкивались с такой проблемой.

Надеюсь, ответы Pekkas помогут вам решить проблему, если она есть в БД, но я также подумал, что вы можете проверить, проходят ли данные, отображаемые на веб-странице, через некоторые функции php, которые немногобайтовый.

Вот некоторые эквиваленты нормальных функций в mb: http://php.net/manual/en/ref.mbstring.php

ps.Если вы недавно перенесли свой сайт на другой сервер (так что это не просто импорт базы данных), вы должны проверить, какие заголовки отправляет ваш сайт, с помощью такого инструмента, как http://www.webconfs.com/http-header-check.php

. Убедитесь, что в последней строке естьUTF8 в нем.

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