UTF-8 и русский язык
-
- phpBB 1.0.0
- Сообщения: 7
- Стаж: 19 лет
если режутся ТОЛЬКО ники, а не темы и скажем ещё что-то....
и режутся не все а только длинные....
то надо полезть в код и посмотреть как там обрабатывается ник.
-при регистрации
-при показе ника.
вполне возможно что считают байты а не символы.
в php были ошибки при работе с мультибайт-строками, как раз кажется в функции substr
поставить php4.4 и проверить - минутное дело во FreeBSD - из портов.
P.S. по количеству бредятинок в коде phpbb держит наверное второе место после oscommerce :-)
и режутся не все а только длинные....
то надо полезть в код и посмотреть как там обрабатывается ник.
-при регистрации
-при показе ника.
вполне возможно что считают байты а не символы.
в php были ошибки при работе с мультибайт-строками, как раз кажется в функции substr
поставить php4.4 и проверить - минутное дело во FreeBSD - из портов.
P.S. по количеству бредятинок в коде phpbb держит наверное второе место после oscommerce :-)
-
- phpBB Guru
- Сообщения: 5484
- Стаж: 21 год 1 месяц
- Поблагодарили: 2 раза
Например? Что-нибудь в студию, пожалуйста.Дятелл писал(а):P.S. по количеству бредятинок в коде phpbb держит наверное второе место после oscommerce
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
-
- phpBB 1.0.0
- Сообщения: 8
- Стаж: 19 лет
Вот только что нашел эти йо...ые функции, вот они то неправильно режут мультибайтные строки:
пробовал менять substr на mb_substring не помогло.
помогло только в лоб поменять 25 на 50, теперь нормально.
Но чувствует мое сердце, что это не правильно.
Код: Выделить всё
function phpbb_clean_username($username)
{
$username = substr(htmlspecialchars(str_replace("\'", "'", trim($username))), 0, 25);
$username = phpbb_rtrim($username, "\\");
$username = str_replace("'", "\'", $username);
return $username;
}
function phpbb_rtrim($str, $charlist = false)
{
if ($charlist === false)
{
return rtrim($str);
}
$php_version = explode('.', PHP_VERSION);
// php version < 4.1.0
if ((int) $php_version[0] < 4 || ((int) $php_version[0] == 4 && (int) $php_version[1] < 1))
{
while ($str{strlen($str)-1} == $charlist)
{
$str = substr($str, 0, strlen($str)-1);
}
}
else
{
$str = rtrim($str, $charlist);
}
return $str;
}
помогло только в лоб поменять 25 на 50, теперь нормально.
Но чувствует мое сердце, что это не правильно.

-
- phpBB Guru
- Сообщения: 5484
- Стаж: 21 год 1 месяц
- Поблагодарили: 2 раза
Как-то вот так, выдрано из search.php
Код: Выделить всё
//
// encoding match for workaround
//
$multibyte_charset = 'utf-8, big5, shift_jis, euc-kr, gb2312';
...
if (strstr($multibyte_charset, $lang['ENCODING']))
{
...
}
else
{
...
}
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
-
- phpBB 1.4.4
- Сообщения: 162
- Стаж: 19 лет 3 месяца
- Благодарил (а): 12 раз
-
- phpBB 1.4.1
- Сообщения: 43
- Стаж: 18 лет 10 месяцев
- Откуда: Владивосток
Добавлю свой способ перекодировки на лету.
В файле includes/functions.php добавляем функцию:
В том же файле изменяем функцию init_userprefs, после включения файла языка пишем код, изменяющий кодировку в массиве $lang
И, наконец, в файле includes/emailer.php меняем код метода класса use_template, перед return true; вставляем код
Все это работает на http://areal.asiadata.ru. В рассылке сообщений можно отправлять иероглифы совместно с русским текстом. Можно на ходу изменять интерфейс (их у меня три: русский, китайский, английский). Остальное не тестировал пока. Потестирую - сообщу результаты.
Конечно, для применения этого метода на действующем форуме придется сперва перекодировать в UTF-8 всю базу данных.
В файле includes/functions.php добавляем функцию:
Код: Выделить всё
function charset_encoder ($from, $to, &$array) {
foreach ($array as $a=>$b) if (gettype ($b)=='array') {
charset_encoder ($from, $to, $b);
$array[$a] = $b;
} else {
$array[$a] = iconv ($from, $to, $b);
}
}
Код: Выделить всё
$from = strtoupper ($lang['ENCODING']);
$to = 'UTF-8';
charset_encoder ($from, $to, $lang);
$lang['ENCODING'] = 'utf-8';
Код: Выделить всё
if (eregi('Charset\:[[:space:]]+([.a-z0-9-]+)', $this->msg, $regs)) {
$from = strtoupper ($regs[1]);
$this->msg = eregi_replace ('Charset\:[[:space:]]+([.a-z0-9-]+)', 'Charset: utf-8', $this->msg);
$this->msg = iconv ($from, 'UTF-8', $this->msg);
}
Конечно, для применения этого метода на действующем форуме придется сперва перекодировать в UTF-8 всю базу данных.
-
- phpBB 1.0.0
- Сообщения: 1
- Стаж: 18 лет 9 месяцев
- Откуда: Israel
Хороший способ, все работает!direqtor писал(а):Добавлю свой способ перекодировки на лету.
Я добавил некоторые изменения, позволяющие менять на лету язык интерфейса форума, нажав на иконку языка. Результат можно посмотреть тут
Версия 2.0.21. В самом начале функции init_userprefs() в includes/functions.php:
Код: Выделить всё
if ( isset( $_GET['lang'] ) ) {
$default_lang = $_GET['lang'];
$default_lang = htmlspecialchars( $default_lang );
} else {
// Old code starts here
if ( $userdata['user_id'] != ANONYMOUS )
...
else {
$default_lang = phpbb_ltrim(basename(phpbb_rtrim($board_config['default_lang'])), "'");
}
// Old code ends here
}
Добавлено спустя 10 минут 51 секунду:
Именно, а как это сделать, чтобы все нормально перенеслось? Я так понимаю есть две проблемы: собственно сама перекодировка и перенос сообщений.direqtor писал(а):Конечно, для применения этого метода на действующем форуме придется сперва перекодировать в UTF-8 всю базу данных.
Перекодировка - пробовал сделать backup старой базы (таблицы постов) и перекодировать в редакторе. Не вышло. Старая база тоже была UTF8, но интерфейс был в кодировке 1251.

Перенос сообщений (еще не дошел до этого) тоже будет проблематичен - ведь id сообщений в старой базе могут наложиться на id в новой (которая уже активна).
Заранее благодарю за конструктивные советы.
-
- phpBB 1.4.1
- Сообщения: 43
- Стаж: 18 лет 10 месяцев
- Откуда: Владивосток
Мои хостеры с Фарпоста обновили phpMyAdmin на версию 2.8.0.2, а там очень интересные добавления на заглавной и на странице импорта таблиц.Именно, а как это сделать, чтобы все нормально перенеслось?
Перекодировка - пробовал сделать backup старой базы (таблицы постов) и перекодировать в редакторе. Не вышло. Старая база тоже была UTF8, но интерфейс был в кодировке 1251.
Заранее благодарю за конструктивные советы.
На заглавной странице можно выбрать кодировку базы данных, например utf-8. А при импорте дампа таблицы или базы можно указать кодировку исходных данных. И все текстовые данные на лету перекодируются.
Я думаю, это поможет.
Правда, сам сперва матом ругался. У меня в одной таблице для сайта несколько языков одновременно, каждый в своей кодировке. Так мне все перекоддировала, что при взгляде на сайт волосы дыбом встали. Но там можно выбрать опцию binary, и тогда текст не перекодируется.
-
- phpBB 1.0.0
- Сообщения: 8
- Стаж: 19 лет
-
- phpBB 1.4.1
- Сообщения: 45
- Стаж: 18 лет 9 месяцев
direqtor,
подскажите пожалуйста по подробнее где именно это нужно поставить:
очень долго уже ищу решение этой проблеммы и наконец с помощью Эксперта нашел.
мне для этофо нужно:
http://phpbbguru.net/community/viewtopi ... highlight=
заранее спасибо!
подскажите пожалуйста по подробнее где именно это нужно поставить:
иdireqtor писал(а):В файле includes/functions.php добавляем функцию:
(если будет время, то пожалуйста по подробнее как в модах)direqtor писал(а):В том же файле изменяем функцию init_userprefs, после включения файла языка пишем код, изменяющий кодировку в массиве $lang
очень долго уже ищу решение этой проблеммы и наконец с помощью Эксперта нашел.
мне для этофо нужно:
http://phpbbguru.net/community/viewtopi ... highlight=
заранее спасибо!
-
- phpBB 1.4.1
- Сообщения: 43
- Стаж: 18 лет 10 месяцев
- Откуда: Владивосток
Из меня все-таки phpbbguru, как из балерины сталеварDiesel писал(а):(если будет время, то пожалуйста по подробнее как в модах)
очень долго уже ищу решение этой проблеммы и наконец с помощью Эксперта нашел.
мне для этофо нужно:
http://phpbbguru.net/community/viewtopi ... highlight=
заранее спасибо!


Касаемо изменений в includes/functions.php, то лишнюю функцию можно добавить в любом его месте, только не внутри другой функции.

Привожу так же полный код измененной функции init_userprefs
Код: Выделить всё
// Initialise user settings on page load
function init_userprefs($userdata)
{
global $board_config, $theme, $images;
global $template, $lang, $phpEx, $phpbb_root_path;
global $nav_links;
if ( $userdata['user_id'] != ANONYMOUS )
{
if ( !empty($userdata['user_lang']))
{
$board_config['default_lang'] = $userdata['user_lang'];
}
if ( !empty($userdata['user_dateformat']) )
{
$board_config['default_dateformat'] = $userdata['user_dateformat'];
}
if ( isset($userdata['user_timezone']) )
{
$board_config['board_timezone'] = $userdata['user_timezone'];
}
}
if ( !file_exists(@phpbb_realpath($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_main.'.$phpEx)) )
{
$board_config['default_lang'] = 'english';
}
include($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_main.' . $phpEx);
if ( defined('IN_ADMIN') )
{
if( !file_exists(@phpbb_realpath($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_admin.'.$phpEx)) )
{
$board_config['default_lang'] = 'english';
}
include($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_admin.' . $phpEx);
}
//
// DIREQTOR CODE BEGIN
//
$from = strtoupper ($lang['ENCODING']);
$to = 'UTF-8';
drqCharsetEncoder ($from, $to, $lang);
$lang['ENCODING'] = 'utf-8';
//
// DIREQTOR CODE END
//
//
// Set up style
//
if ( !$board_config['override_user_style'] )
{
if ( $userdata['user_id'] != ANONYMOUS && $userdata['user_style'] > 0 )
{
if ( $theme = setup_style($userdata['user_style']) )
{
return;
}
}
}
$theme = setup_style($board_config['default_style']);
//
// Mozilla navigation bar
// Default items that should be valid on all pages.
// Defined here to correctly assign the Language Variables
// and be able to change the variables within code.
//
$nav_links['top'] = array (
'url' => append_sid($phpbb_root_path . 'index.' . $phpEx),
'title' => sprintf($lang['Forum_Index'], $board_config['sitename'])
);
$nav_links['search'] = array (
'url' => append_sid($phpbb_root_path . 'search.' . $phpEx),
'title' => $lang['Search']
);
$nav_links['help'] = array (
'url' => append_sid($phpbb_root_path . 'faq.' . $phpEx),
'title' => $lang['FAQ']
);
$nav_links['author'] = array (
'url' => append_sid($phpbb_root_path . 'memberlist.' . $phpEx),
'title' => $lang['Memberlist']
);
return;
}
Правда, в вашей версии phpbb остальной код может отличаться, будте внимательны
-
- phpBB 1.0.0
- Сообщения: 1
- Стаж: 19 лет
Еще вопрос:
И база, и сайт - utf-8. Поиск работает.
А вот авто Автоцензор не работает на руские символы, т.е. работает только на слова, где все символы латинские.
Собака, как понимаю, порылась в файле functions.php, в функции obtain_word_list, в строчке:
Почитав связанное с функцией preg_replace, понял, что надо добавить модификатор u.
Так вот и вопрос - в каком месте этот u ставить, пробовал разные варианты - не получается?
И база, и сайт - utf-8. Поиск работает.
А вот авто Автоцензор не работает на руские символы, т.е. работает только на слова, где все символы латинские.
Собака, как понимаю, порылась в файле functions.php, в функции obtain_word_list, в строчке:
Код: Выделить всё
$orig_word[] = '#\b(' . str_replace('\*', '\w*?', preg_quote($row['word'], '#')) . ')\b#i';
Так вот и вопрос - в каком месте этот u ставить, пробовал разные варианты - не получается?

-
- phpBB 2.0.0
- Сообщения: 220
- Стаж: 19 лет 11 месяцев
- Откуда: Архангельск
Этот скрипт на Перле производит замену всех однобайтовых функций (например, strlen) на многобайтныей (mb_strlen). Это для тех, кто не имеет возможности указать PHP переопределить функции (mbstring.func_overload). Спрашивается, как потом обновлять phpBB? Очень просто: берётся патч, на него натравливается этот скрипт, затем патч накладывается как обычно.
Код: Выделить всё
#!/usr/bin/perl -w
use integer;
use strict;
foreach my $s (@ARGV)
{
rename($s, "$s.bak") || die "Can't rename $s: $?";
open(IN, "<$s.bak") || die "Can't read $s.bak: $?";
open(OUT, ">$s") || die "Can't write $s: $?";
while(<IN>)
{
s/(\W)mail *(?=\()/$1mb_send_mail/g;
s/(\W)(strlen|strpos|substr) *(?=\()/$1mb_$2/g;
s/(\W)(strtolower|strtoupper) *(?=\()/$1mb_$2/g;
s/(\W)(ereg|eregi|ereg_replace|eregi_replace) *(?=\()/$1mb_$2/g;
s/(\W)(split|substr_count) *(?=\()/$1mb_$2/g;
print;
print OUT;
}
close(OUT);
close(IN);
}
Гугл рулит. Я люблю ЛОР.
Интересно, они пришли с миром или им таки нужен наш моск?
Знания принадлежат всему человечеству.
Интересно, они пришли с миром или им таки нужен наш моск?
Знания принадлежат всему человечеству.
-
- phpBB 1.0.0
- Сообщения: 4
- Стаж: 18 лет 6 месяцев
Подскажите ПЛЗ есть форум forum.chihara.ru и все хорошо все работает в кодировке utf-8 и впринципе замечаний нет кроме одной проблемы в одну тему мне постоянно пишут спамеры
ну и это еще ничего можно жить но они какимто образом умудряются писать в CP-1251 как уних это получается не могу понять хоть убейте меня все остальные пользователи как пользователи пишут и знать не знают что там какието кодировки существуют ....
Вобщем как такое может быть все работает в utf-8, но ктото умудряется писать в CP-1251 (эти ктото спамеры!!)??????




Вобщем как такое может быть все работает в utf-8, но ктото умудряется писать в CP-1251 (эти ктото спамеры!!)??????


-
- Former team member
- Сообщения: 9683
- Стаж: 18 лет 11 месяцев
- Откуда: Питер
- Благодарил (а): 1 раз
- Поблагодарили: 27 раз
leskov_oleg, дружок, эта строчка из твоего overall_header.tpl
Ничего не впечатляет? 8)<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
Не все то WINDOWS, что висит... phpBB только учусь.
ICQ, email, ЛС - только для личных сообщений. Вопросы по phpbb только на форумах. По найму не работаю.
ICQ, email, ЛС - только для личных сообщений. Вопросы по phpbb только на форумах. По найму не работаю.