UTF-8 и русский язык

Вопросы, связанные с локализацией phpBB 2.0.x
mainsan
phpBB 1.0.0
Сообщения: 7
Зарегистрирован: 06.04.2006 15:55
Контактная информация:

UTF-8 и русский язык

Сообщение mainsan » 06.04.2006 16:20

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

На сайте используется кодировка Utf-8 (как я понимаю, это из-за того, что она используется на сервере). Хостер сайта - я, на своем сервере apach. Адрес - http://www.hr-outsourcing.com.ua/hr-outlook/forum
В базе данных - не знаю, как определить какая кодировка, но в PhpMyAdmin в разедел переменных - character set - latin1.
Устанавливаю форум PhpBB 2.017, что касается английского - все нормально. Но как только переключаюсь на русский - окно браузера пустое. Меняю кодировку браузера с UTF-8 на Win-1251, все появляется, как только перехожу на другую страницу - снова все пусто.
Далее - добавил одно русское сообщение. Оно не отображается нормально ни при каких раскладах. Если же выставить кодировку Utf-8 в браузере, то название темы выглядит частично нормально, частично - нечитаемо, а все интерфейсные сообщения вообще нераспознаваемый набор символов.

Пробовал менять language_main.php с windows-1251 на utf-8 и ru-utf-8, пробовал добавлять код, который выкладывали на форуме, не помогает. Что нужно сделать в такой ситуации?

Хотелось бы, чтобы в ответе прояснили смысл всех действий, а не только дали инструкции по исправлению. Спасибо.

mainsan
phpBB 1.0.0
Сообщения: 7
Зарегистрирован: 06.04.2006 15:55
Контактная информация:

Сообщение mainsan » 07.04.2006 15:27

Проблема в определенной степени решена - требовалось просто перекодировать все файлы форума из Win в UTF-8. Осталась только проблема сообщений, интерфейс уже отображается правильно.

Дятелл
phpBB 1.0.0
Сообщения: 7
Зарегистрирован: 07.04.2006 15:41

Сообщение Дятелл » 07.04.2006 15:50

перед инсталляцией надо создать базу для форума с default charset=utf8 и collation=utf8_general_ci из того же phpmyadmin

крайне рекомендую версию mysql новее 4.1.14

также очень рекомендую php переставить на свежий из ветки 4.x.x

в php.ini или настройках прописать mbstring.overload 6 (именно 6, иначе может некоректно отправляться почта) если этого не сделать - будет урезать вдвое все русские названия тем.

некоторые изменения в коде придётся сделать для корректной отправки email (особенно Subj) в кодировке UTF

mainsan
phpBB 1.0.0
Сообщения: 7
Зарегистрирован: 06.04.2006 15:55
Контактная информация:

Сообщение mainsan » 10.04.2006 18:35

Дятелл писал(а):перед инсталляцией надо создать базу для форума с default charset=utf8 и collation=utf8_general_ci из того же phpmyadmin

крайне рекомендую версию mysql новее 4.1.14

также очень рекомендую php переставить на свежий из ветки 4.x.x

в php.ini или настройках прописать mbstring.overload 6 (именно 6, иначе может некоректно отправляться почта) если этого не сделать - будет урезать вдвое все русские названия тем.

некоторые изменения в коде придётся сделать для корректной отправки email (особенно Subj) в кодировке UTF
Спасибо большое за советы, они очень кстати, как раз столкнулся с проблемой обрезания русских тем. Только не помогает почему, то прописал в php.ini mbstring.func_overload = 6, но сообщения по прежнему обрезаются, даже после переустановки форума. "или в настройках" - это значит, что можно прописать где-то еще? а можно еще подробнее узнать про изменения в коде, которые нужно сделать для работы почты?

Дятелл
phpBB 1.0.0
Сообщения: 7
Зарегистрирован: 07.04.2006 15:41

Сообщение Дятелл » 10.04.2006 22:27

обрезать может и база данных - если в ней однобайтовая кодировка так и осталась стоять.

кроме mbstring.overload для корректной работы с UTF надо и остальные mbstring параметры выставить. у меня были проблемы со "старыми" версиями php - сейчас стоит 4.4.1 вроде всё нормально.

с mail надо поискать, уже забыл где что делал :-)
вкратце -
в emailer.php
найти

Код: Выделить всё

$this->subject = trim(preg_replace('#[\n\r]+#s', '', $subject));
заменить на

Код: Выделить всё

$this->subject = '=?UTF-8?B?'.base64_encode(trim(preg_replace('#[\n\r]+#s', '', $subject)))."?=\n";
это не совсем по RFC но работает - спокойно проскакивают русские буквы в subj
такую штуку надо делать обязательно для русскоязычныйх форумов в любой кодировке! отправка некодированного subj приводит к многочисленным глюкам с почтой! мне вот кстати с этого форума всё кубиками приходит :-)

та же процедура в groupcp.php

везде в шаблонах для писем прописал

Charset: utf-8

тот же чарсет указал везде в конфигах, шаблонах и т.п.

danilevsky
phpBB 1.0.0
Сообщения: 8
Зарегистрирован: 15.04.2006 13:56

Сообщение danilevsky » 15.04.2006 14:11

mainsan писал(а):Проблема в определенной степени решена - требовалось просто перекодировать все файлы форума из Win в UTF-8
каким способом ты перекодировал эти файлы?

Дятелл
phpBB 1.0.0
Сообщения: 7
Зарегистрирован: 07.04.2006 15:41

Сообщение Дятелл » 15.04.2006 15:10

Код: Выделить всё

<?php
//ini_set("memory_limit","200M");
//error_reporting (E_ALL ^ E_NOTICE);
encoder("./htdocs.win");

function encoder($path_to) {
echo"$path_to/\n";
        if ( is_dir($path_to) ) {
                if ($handle = opendir($path_to) ) {
                    while (false !== ($file = readdir($handle))) {
                        if ($file != "." && $file != "..") {
                            $path = "$path_to/$file";
                            echo "$path/\n";
                           encoder("$path_to/$file");
                        }
                    }
                closedir($handle);
        } else {
                return;
        }
        } elseif ( is_file($path_to) && preg_match("/.*\.txt$/",$path_to) ) {
                $content = file_get_contents("$path_to");
                if (preg_match("/charset\=/i",$content)==1 ) {
                  $content = preg_replace("/charset\=windows-1251/i","charset=utf-8",$content);
                  echo"*";
                }
                $content = iconv("WINDOWS-1251","UTF-8",$content);
                $path=preg_replace("/^\.\/htdocs\.win(.*)$/","./htdocs.utf$1",$path_to);
                $fp = fopen ("$path", "w");
                if (!$fp) { echo "Unable to open remote file for writing.";  exit; }
                fputs ( $fp,$content);
                fclose($fp);
                $content='';
                echo "$path\n";
                return ;
        } else { return 0; }
    return ;
}
?>
так, сляпал на скорую руку...

mainsan
phpBB 1.0.0
Сообщения: 7
Зарегистрирован: 06.04.2006 15:55
Контактная информация:

Сообщение mainsan » 17.04.2006 19:38

danilevsky писал(а):
mainsan писал(а):Проблема в определенной степени решена - требовалось просто перекодировать все файлы форума из Win в UTF-8
каким способом ты перекодировал эти файлы?
Перекодировал с помощью редактора Macromedia HomeSite 5, там есть такая возможность. Хотя один файл, lang_main.php упорно не хотел им перекодироваться, происходило усечение всего файла кроме последних нескольких строчек, пришлось использовать простой NotePad из стандартных в Windows 2000 (сохранить как - там есть выбор кодировки).

2Дятелл

Спасибо за помощь.
Обрезание заголовков тем проиходило по вине базы данных, сменил тип поля заголовка (где менять посмотрел в статье http://www.phpbbguru.net/docs/?id=13 на сайте) на Text, все нормализовалось.

Дятелл
phpBB 1.0.0
Сообщения: 7
Зарегистрирован: 07.04.2006 15:41

Сообщение Дятелл » 18.04.2006 0:01

ну теперь ждите, запостит вам кто-нибудь заголовок в 60 килобайт :-)

скорость индексирования БД тоже упадёт, впрочем, ненамного.

quazi
phpBB 2.0.2
Сообщения: 306
Зарегистрирован: 15.03.2005 18:49
Контактная информация:

Сообщение quazi » 18.04.2006 0:17

mainsan
читайте здесь - http://faq.dklab.ru/denwer?v=tla#h30-32
mainsan писал(а):Хостер сайта - я
надо. надо - самому стараться вникать.
сам себе хостер - значит сам себе хозяин, что захотел, то и поставил

danilevsky
phpBB 1.0.0
Сообщения: 8
Зарегистрирован: 15.04.2006 13:56

Сообщение danilevsky » 19.04.2006 12:24

Дятелл писал(а):обрезать может и база данных - если в ней однобайтовая кодировка так и осталась стоять.
Вот возникала проблема:
Файлы форума и базу данных перевел в utf-8
Например на phpBB максимальная длинна ника 25 символов (в таблице phpbb_users, username равно varchar(25))
так вот когда сохраняешь ник на русском языке длинной в 25 символов он обрезается потому как в базе данных юникоде один нелатинский символ считается как за два.
Решил, что решение проблемы изменить в базе данных длинну всех текстовых полей умножив значение на два. (тесть было: varchar(25) стало: varchar(50)) тогда все сохраняется нормально.
Но может есть какой еще вариант решения этой проблемы более правильный?

Добавлено спустя 20 минут 31 секунду:

И вот еще что творится.
Регистрирую пользователя, ник которого на русском. Регистрация проходит нормально.
Регистрирую второго, тоже на русском - но выдает, что такой пользователь уже зарегестрирован.
Проделываю тоже самое, только ник пользователя на английском - все регестрируется.
Что за прикол?

Добавлено спустя 19 минут 49 секунд:

Вот что обнаружил:
phpBB стал обьявлять что пользователи уже существуют после того как поставил следующий код:

Код: Выделить всё

mysql_query("SET NAMES utf8");
Но если не ставить этот код, то пользователей можна добавлять, но тогда информация записывается в базу данный в таком виде:
ДанилевÑ&#129;кий

Дятелл
phpBB 1.0.0
Сообщения: 7
Зарегистрирован: 07.04.2006 15:41

Сообщение Дятелл » 19.04.2006 13:00

надо проверить:
если ник обрезается ещё в PHP ДО зписи в базу - не настроены параметры mbstring.overload в php.ini

если режет сама база - значит таки не настроено использование collation для таблиц азы

в общем, очень советую почитать документацию к mysql и php в части поддержки многобойтных кодировок.

да, и собствеено чем вы пользуетесь при работе с базой? если phpmyadmin - то я вас поздравляю, он от юникода просто балдеет местами, как раз и показывая всякие ДанилевÑ�кий
для phpmyadmin mbstring.overload надо отключить.

P.S. php 4.4.10 и mysql 4.1.18 заведомо работают с юникодом. если у вас не работает - значит что-то не так настроено :-)

danilevsky
phpBB 1.0.0
Сообщения: 8
Зарегистрирован: 15.04.2006 13:56

Сообщение danilevsky » 19.04.2006 13:27

Дятелл писал(а):если режет сама база - значит таки не настроено использование collation для таблиц азы
режит сама база. установил varchar в два раза больше и все заработало. А что ты имеешь в виду под настройкой collation?
вот так создавал базу:

Код: Выделить всё

CREATE DATABASE `ukrarab` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Дятелл писал(а):да, и собствеено чем вы пользуетесь при работе с базой? если phpmyadmin - то я вас поздравляю, он от юникода просто балдеет местами, как раз и показывая всякие ДанилевÑ�кий
для phpmyadmin mbstring.overload надо отключить.
да я пользуюсь phpmyadmin. он так именно символы и показывает, но если вставить после соедниения с базой mysql_query("SET NAMES utf8"); он начинает нормально символы показывать? Как это можна обьяснить?

Дятелл
phpBB 1.0.0
Сообщения: 7
Зарегистрирован: 07.04.2006 15:41

Сообщение Дятелл » 19.04.2006 13:44

надо смотреть настройки my.cnf - какая кодировка стоит по умолчанию для client

в остально трудно советовать - у меня сервер с нативно установленной UTF (Slackware) и все компоненты (мускуль, пхп, апач) пересобраны из исходников с нужными мне настройками.

при старте скрипта полезно делать setlocale(LC_ALL,"ru_RU.UTF-8")
и setlocale(LC_NUMERIC,"en_US")

да и вообще системную локаль надо привести в соответствие

danilevsky
phpBB 1.0.0
Сообщения: 8
Зарегистрирован: 15.04.2006 13:56

Сообщение danilevsky » 22.04.2006 10:15

Я убит. Не знаю как решит этот вопрос.
Поставил форум на хостинг FreeBSD, Apache 1.33, php4.3, MySQL 4.1
Базу данных перевел в utf-8. Все работает ок, только ники обрезаются вполовину, но уже не базой, а самим php. (проверил это путем увеличения поля для ника в базе данных).
Прописал в htaccess следующее:
php_value mbstring.func_overload 6
теперь при регистрации пользователя с русским ником мне выдает что пользователь такой есть.
Я уже замучался... Что делать?

Закрыто

Вернуться в «Локализация phpBB 2.0.x»