man linux — заметки админа

5 февраля 2011

Horde — решение проблемы с русским языком

Есть такой вебмейл интерфейс — Horde.
И в целом он совсем не плох, только вот есть проблема с русскими символами, русскими именами и вообще с русскими кодировками.
Например при добавлении контакта с русским именем в horde адрессную книгу, получаем ошибку:
DB Error: unknown error
Здесь я опишу очень простой рецепт решения всех этих проблем
Заходим в браузере в веб-интерфейс Horde, смотрим в настройках страницы кодировку, которую выбрал браузер для этой страницы, что бы понять, в какой кодировке у нас отдает страницы Horde.

У меня, например, оказалась кодировка utf-8 и это пришлось очень кстати.

Дальше все очень просто:
Идем в терминал, выполняем:

mysqldump --add-drop-table horde > horde.sql

где horde это имя БД используемой horde
Открываем файл horde.sql, лично я пользуюсь nano

nano horde.sql
ctrl+w
ctrl+r

Это что бы включить режим замены.
Далее вбиваем что менять:
DEFAULT CHARSET=latin1;
На что менять:
DEFAULT CHARSET=utf8;
Жмем Enter, жмем А (заменить все), и сохраняем файл:

ctrl+o
ctrl+x

Сохранив файл и закрыв nano таким образом, остается последний штрих:

mysql horde < horde.sql

Все - наслаждаемся поддержкой русских текстов в Horde :)

Добавлено через два часа:

Наслаждаемся, но не долго :D Поскольку начинаем замечать, что некоторые символы, например "И" (русская буква И именно в этом регистре) не проходят в БД и это приводит к ошибкам.

Что бы устранить это досадное упущение, открываем скрипт
horde/pear/php/DB/mysql.php
Находим там такой кусок кода:

        $ini = ini_get('track_errors');
        $php_errormsg = '';
        if ($ini) {
            $this->connection = @call_user_func_array($connect_function,
                                                      $params);
        } else {
            @ini_set('track_errors', 1);
            $this->connection = @call_user_func_array($connect_function,
                                                      $params);
            @ini_set('track_errors', $ini);
        }
 
        if (!$this->connection) {
            if (($err = @mysql_error()) != '') {
                return $this->raiseError(DB_ERROR_CONNECT_FAILED,
                                         null, null, null,
                                         $err);
            } else {
                return $this->raiseError(DB_ERROR_CONNECT_FAILED,
                                         null, null, null,
                                         $php_errormsg);
            }
        }

И добавляем сразу после этого места строку:

mysql_query('SET NAMES utf8');

В итоге это выглядит так:

        $ini = ini_get('track_errors');
        $php_errormsg = '';
        if ($ini) {
            $this->connection = @call_user_func_array($connect_function,
                                                      $params);
        } else {
            @ini_set('track_errors', 1);
            $this->connection = @call_user_func_array($connect_function,
                                                      $params);
            @ini_set('track_errors', $ini);
        }
 
        if (!$this->connection) {
            if (($err = @mysql_error()) != '') {
                return $this->raiseError(DB_ERROR_CONNECT_FAILED,
                                         null, null, null,
                                         $err);
            } else {
                return $this->raiseError(DB_ERROR_CONNECT_FAILED,
                                         null, null, null,
                                         $php_errormsg);
            }
        }
mysql_query('SET NAMES utf8');
        if ($dsn['database']) {
            if (!@mysql_select_db($dsn['database'], $this->connection)) {
                return $this->mysqlRaiseError();

Проверяем - работает :)


Автор: Виктор Симон
www.man-linux.ru
Права копирования
Опубликовано 5 февраля 2011 - информация могла устареть.

Комментариев нет »

No comments yet.

RSS feed for comments on this post.

Leave a comment

Для отправки комментария вам необходимо авторизоваться.

Powered by WordPress