We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 897
    • 1,620 Posts
    Встепление.

    не знаю по каким причинам, но все еще встречаются сайты и веб-мастера, которые используют cp1251. В этом случаи при работе с modx приходится решать массу проблем, начиная от QuickEdit и заканчивая AjaxSearch. Ниже я покажу как разом решить все будущие проблемы с кодировками. Решение основывается на моем опыте, может быть неидеальным, подходит сайтам которые уже работают, но не используют utf8.

    Исходное положение дел.

    Есть сайт, в админке и на фронтэнде все показывается нормально, нет "кракозябр", но база в кодировке latin1 или cp1251. Такое может быть когда база по умолчанию у хостера создается с кодировкой отличной от utf8.

    Переводим базу в UTF8.
    ДЕЛАЕМ РЕЗЕВНУЮ КОПИЮ БАЗЫ ДАННЫХ И ФАЙЛОВ НА ХОСТИНГЕ. Если что, я вас предупредил. wink
    Если сайт показывается нормально, это значит, что сопоставление кодировок и метод сопоставления кодировок из файла manager/include/config.inc.php работает верно. Теперь нам надо получить бекап базы в кодировке UTF8. сделать это нам поможет штатная утилита modx. Доступ к утилите "Инструменты" -> "Резервное копирование". Прежде чем делать резерное копирование, надо немного поправить файл manager/actions/bkmanager.static.php (по крайней мере для 1.0 точно). Перед изменеием вам надо открыть файл manager/includes/config.inc.php и запомнить (записать) значение следующих параметров:
    ...
    $database_connection_charset = 'latin1';
    $database_connection_method = 'SET CHARACTER SET';
    ...
    

    Итак в указаном примере кодировка latin1 и метод SET CHARACTER SET. Значит в файле manager/actions/bkmanager.static.php вам надо изменить строчку 59:
    ...
    $dumper = new Mysqldumper($database_server, $database_user, $database_password, $dbname);
    ...
    

    на
    ...
    $dumper = new Mysqldumper($database_server, $database_user, $database_password, $dbname, 'latin1', 'SET CHARACTER SET');
    ...
    

    все, сохранаяем идем в админку "Инструменты" -> "Резервное копирование" помечаем все таблицы, отмечаем "Включать в дамп инструкцию ’DROP TABLE’", нажимаем сохранить. Полученный файл открываем текстовым редактором, который может менять кодировки файлов. В файле заменяем все упоминания latin1 на utf8, сохраняем файл в кодировке utf8. Не забудьте удостовериться что русские символы в файле отображаются правильно (посмотрите на вторую строчку файла, там название сайта, как оно указано в конфигураторе).

    Дальше вам потребуется доступ к вашей базе данных через phpMyAdmin (большинство хостеров предоставляют такой доступ). Выбираем нужную базу данных и на странице списка таблиц в базе, нажимаем последнюю вкладку "Операции", там в самом низу видим поле сравнение, выбираем utf8_general_ci, сохраняем изменения.
    Если такой вкладки и поля "сравнение" найти не удалось, можете выполнить просто sql запрос:
    alter database имя_вашей_базы_данных charset=utf8;
    

    После успешной смены кодировки, останется загрузить наш sql-дамп. Нажимаем "Импорт" указываем наш подготовленный файл, нажимаем Ok. Если все прошло нормально, идем дальше.
    Открываем файл manager/includes/config.inc.php и меняем
    ...
    $database_connection_charset = 'latin1';
    $database_connection_method = 'SET CHARACTER SET';
    ...
    

    на
    ...
    $database_connection_charset = 'utf8';
    $database_connection_method = 'SET NAMES';
    ...
    

    сохраняем. идем в админку сайта, там "Инструменты" -> "Конфигурация", на вкладке "Сайт" меняем "язык системы управления" на Russian-UTF8 и "кодировка" на Unicode (UTF-8) - utf-8. Сохраняем. Проверяем сайт и админку на правильность отображения русских буковок.

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

    ВСЕ НА UTF-8!!
      "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

      Не используйте Revo для "просто сайтов". Используйте Evo

      Who can defeat the Russian bear?
      • 785
      • 2,113 Posts
      Quote from: Aleksey at Aug 04, 2009, 03:38 AM

      Дальше вам потребуется доступ к вашей базе данных через phpMyAdmin
      Если есть phpMyAdmin, зачем что-то править в MODx и использовать встроенные средства, когда можно просто экспортировать сайт с помощью phpMyAdmin, исправить кодировку (удобно с помощью Notepad++) и импортировать обратно.
      И команда для смены кодировки, как мне кажется, более уместна: ALTER DATABASE `имя_базы_данных` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci
      Не меняя COLLATE приходится использовать SET NAMES, хотя вероятность проблем остается.

      Кстати, надо помнить, что смена кодировки сайта не сводится к простому перекодированию – потребуется менять шаблоны (где указана кодировка), вызовы некоторых сниппетов (где указан язык) и так далее.
        Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
        Статьи о MODx, регулярно новые публикации
        • 897
        • 1,620 Posts
        попробуйте через phpMyAdmin сделать дамп-базы и посмотреть что получиться.
        SET NAMES заменяет сразу несколько установок, что очень удобно.

        A SET NAMES ’x’ statement is equivalent to these three statements:

        SET character_set_client = x;
        SET character_set_results = x;
        SET character_set_connection = x;

          "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

          Не используйте Revo для "просто сайтов". Используйте Evo

          Who can defeat the Russian bear?
          • 897
          • 1,620 Posts
          кстати, и кодировка в шаблоне, тэг meta игнорируется, если стоит автоопредиление в браузере (FF)
            "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

            Не используйте Revo для "просто сайтов". Используйте Evo

            Who can defeat the Russian bear?
            • 785
            • 2,113 Posts
            Quote from: Aleksey at Aug 04, 2009, 04:48 AM

            попробуйте через phpMyAdmin сделать дамп-базы и посмотреть что получиться.
            Постоянно пробую – все отлично получается.

            Про SET NAMES и SET CHARACTER SET – это отдельный разговор, и там все далеко не однозначно, но в любом случае меняя кодировку правильно задавать и нужное сравнение.

            А если какой-то браузер игнорирует метатег, это не является основанием для неверной установки этого тега.

            Кстати, давно не работал с cp1251, но мне кажется, что в последних версиях AjaxSearch уже нет проблем с этой кодировкой (это только мне кажется, сам не пробовал и могу ошибаться).
              Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
              Статьи о MODx, регулярно новые публикации
              • 785
              • 2,113 Posts
              Расскажу вкратце о том, как я переносил сайт с одного хостинга на другой, одновременно меняя кодировку с cp1251 на utf8 (кое-что для простоты опущено).
              1. С помощью phpMyAdmin экспортировал базу.
              2. Текстовым редактором изменил кодировку и им же исправил значения в вызовах сниппетов, в конфигурации и в шаблонах.
              3. Перенес файлы, изменив кодировку в конфигурационном файле.
              4. Импортировал базу на новом месте с помощью PHPMyAdmin.
              И все – все кодировки сменились, все отлично заработало. То есть практически надо сделать экспорт в phpMyAdmin, обработать полученный файл, импортировать обратно в базу и изменить файл конфигурации. И не забыть после всех манипуляций очистить кэш.
                Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                Статьи о MODx, регулярно новые публикации
                • 897
                • 1,620 Posts
                попробуйте туже процедуру когда у вас сайт в cp1251, а база в latin1 (ситуация распространненая). в любом случаи, я дал рецепт, проверенный на практике, если у кого-то получиться по схеме акотса, тогда ему повезло с хостером, если кому-то поможет мой совет - значит я не зря писал.
                  "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

                  Не используйте Revo для "просто сайтов". Используйте Evo

                  Who can defeat the Russian bear?
                  • 897
                  • 1,620 Posts
                  Quote from: AKots at Aug 04, 2009, 05:07 AM

                  А если какой-то браузер игнорирует метатег, это не является основанием для неверной установки этого тега.
                  приоритет HTTP заголовка выше чем мета-тэга, а так как modx отдает в заголовке кодировку выставленную в конфигурации, то по большому счету на meta можно закрыть глаза. Но сточки зрения академической, то нельзя smiley
                    "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

                    Не используйте Revo для "просто сайтов". Используйте Evo

                    Who can defeat the Russian bear?
                    • 25441
                    • 60 Posts
                    А если кодировка системы в UTF8, а база в cp1251. Всё отображается нормально кроме модуля EasyPoll.

                    Как перевести корректно?

                    Я делаю дамп, меняю cp1251 на utf8. Заливаю назад делаю ALTER DATABASE `имя_базы_данных` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci

                    Всё равно кракозябра остается
                      • 26883
                      • 137 Posts
                      Ну, а сам SQL-файл перекодирован? Откройте в Notepad++ и посмотрите, в какой он кодировке. Если "Кодировать в ANSI", то сделайте "Преобразовать в UTF-8 без BOM". В SQL после этого все русские символы должны правильно показываться. И в базе - тоже. И в админке - строки, берущиеся из базы (дерево и прочее). И в конфигурации сайта должна быть UTF-8.