miniBB ® 

miniBB

®
Support Forums
  
 | Start | Register | Search | Statistics | File Bank | Manual |
Русские miniBB Support Forums / Русские /  
 

Некорректно работает substr()

 
 
Page  Page 1 of 3:  1  2  3  Next »

Author bestit
Partaker
#1 | Posted: 10 Oct 2018 16:47 
Функция substr(), применяемая в коде обработки (обрезки слишком длинных строк) названия темы, имени пользователя, в плагине вывода на сайте первой страницы (addon_1stpagenews2), может еще где-то режет строку с русскими буквами кодировки UTF-8 некорректно.

Получается вот такой результат:
substring result on utf8

Я нашел выход через замену функции на аналогичную, умеющую работать с многобайтовыми кодировками: mb_substr(), но это может потребовать настройки сервера - необходимо подключить в php.ini библиотеку mbstring (раскомментировать строку "extension=php_mbstring.dll" и перезапустить Apache)

Другой возможный вариант - перед применением функции substr() выполнить конвертацию в Win1251, а затем после обработки, конвертировать обратно в UTF-8

Author Paul
Lead Developer 
#2 | Posted: 11 Oct 2018 20:51 
bestit:
выход через замену функции на аналогичную, умеющую работать с многобайтовыми кодировками: mb_substr()
Это не подходит. Пользователи нынче еле-еле в текстовом редакторе исправить что-то могут :) Установка специфических функций на сервере хоронит распространяемость продукта.

Исправление будет в bb_func_txt.php; позже я его включу в обновлённую версию, пока что обновил только на этом форуме для тестов. Там новые функции strlen_unicode и substr_unicode, а также обрезка по символам идёт в самой начале функции. Учитывая, что длина поля заголовка темы сейчас в БД по умолчанию равна 700 байтам, а настройка $topic_max_length не должна превышать 250 символов, этого должно хватить для любого рода манипуляций. Можете потестировать у себя или на этом форуме.

Обновлённый bb_func_txt.php.

Author bestit
Partaker
#3 | Posted: 11 Oct 2018 21:49 
Спасибо, Павел.
Согласен про серверные настройки, скачал фикс, буду проверять.

Author bestit
Partaker
#4 | Posted: 18 Oct 2018 19:48 
Павел, я заменил файл на предложенный.
Не помогло.
При просмотре сообщений по-прежнему обрезается некорректно имена пользователей.
substring result

Та же проблема в при отображении сообщений на сайте первой страницы (addon_1stpagenews2.php)
substring result on first page

Author Paul
Lead Developer 
#5 | Posted: 18 Oct 2018 21:26 
Да, вижу , что это требует ещё доработок. В аддоне новостей нужно просто функцию поменять. А вот насчет юзернейма надо смотреть... Смогу представить поправки только на след.неделе. Спасибо за репорты.

Author bestit
Partaker
#6 | Posted: 19 Oct 2018 12:42 
просто поменять функцию substr() на substr_unicode не сработало

файл addon_1stpagenews2.php

/* (c) MNN 2018-10-17 заменил substr на mb_sustr(), затем на substr_unicode() и strlent_unicode() */
/*$topics[$tid]['post_text']=mb_substr(strip_tags(str_replace('<br />', "\n", $res[1])), 0, $maxTxtLength);*/
$topics[$tid]['post_text']=substr_unicode(strip_tags(str_replace('<br />', "\n", $res[1])), 0, $maxTxtLength);
$topics[$tid]['topic_time']=convert_date($res[2]);
$topics[$tid]['topic_poster_name']=$res[3];
if (strlen_unicode(strip_tags($res[1]))>$maxTxtLength) $topics[$tid]['post_text'].='...';
Потому что php не нашел описаний этих функций.

Пришлось сверху добавить:
if(!$excludeIncludes){
define ('INCLUDED776',1);
include ("{$path}setup_options.php");
include ("{$path}setup_{$DB}.php");
include ("{$path}bb_functions.php");
include ("{$path}bb_func_txt.php");
}

Но после этого пришла ошибка на 10-ю строку уже bb_func_txt.php
Пришлось тут путь скорректировать.

if (!defined('INCLUDED776')) die ('Fatal error.');

/* include ($pathToFiles.'bb_codes.php'); */
include ("{$path}bb_codes.php");
На первой странице все заработало как надо.

Но я очень не уверен, что все это правильно и не вылезет где-то еще.

P.S. да, так вылазит в другом месте. Вернул все изменения взад. Подожду Вашего кода :)

Notice: Undefined variable: path in ............/forum/bb_func_txt.php on line 11

Author Paul
Lead Developer 
#7 | Posted: 24 Oct 2018 13:18 
Вы всё правильно, по сути, делали, только с путями не разобрались :)

Вот версия скрипта новостей для обновлённого bb_func_txt.

Сообщите, будет ли всё корректно работать. Обновить официально я его смогу только после обновлённого релиза ядра, т.к. функции strlen_unicode нет в текущем релизе.

Наверное, если всё будет работать, как надо, то же самое нужно обновить и для RSS-аддона.

Author Paul
Lead Developer 
#8 | Posted: 24 Oct 2018 14:12 
Что касается отображения юзернейма - да, там более сложный, но исправимый косяк. Я обновил все файлы, которые за последние несколько дней вошли в ротацию, и по ним уже предлагаю ориентироваться.

Уже сейчас понятно, что т.к. многие годы мы работали с однобайтовыми кодировками и дела не было до всего того, что касается UTF8 :) поэтому в скриптах много где нужно менять default-функции substr и strlen на substr_unicode и strlen_unicode, над этим я буду работать в следующем релизе... пока что для фикса этих юзернеймов попробуйте обновить новые версии.

Author bestit
Partaker
#9 | Posted: 24 Oct 2018 23:23 
Спасибо Павел, что не забываете нужды соотечественников :)
Отредактированный скрипт новостей я взял, привел к нужной мне настройке и все уже корректно работает.

А на проблему с UTF8 я первый раз наткнулся еще весной, вот каким образом. На момент, когда я подключился к текущему проекту, форум на miniBB 2.0 уже где-то с полгода как был сконвертирован с Win1251 на UTF8 кем-то из-за переезда на какой-то очередной хостинг.
И тут жена решила отредактировать какое-то старинное сообщение и с удивлением сообщила мне, что при сохранении у нее половина сообщения исчезла....
Думаю, как это? И только потом, сопоставив разные факты, я догадался, что глобальная настройка длины сообщения в setup_options.php $post_text_maxlength=10240; была рассчитана на однобайтовую кодировку. А при тупой конвертации БД на UTF8 сообщение с длиной 10240 однобайтовых символов стало занимать до 20480 байт визуально тех же символов, т.к. каждый символ стал двухбайтовым! Поэтому в БД все старье хранилось корректно до нового редактирования, а после редактирования оно естественно урезалось до 10240 согласно настройке :)
Так что просто в настройках умножил нужные лимиты на два и все заработало в лучшем виде.
:)

А вот на втором этапе уже стал натыкаться на некорректную обрезку русских слов. Ну и это с Вашей помощью постепенно пофиксим.

Author bestit
Partaker
#10 | Posted: 25 Oct 2018 00:15 
Вот еще пример, где нужно учитывать юникод.

Мне позавчера потребовалось разрешить логины только на русском языке.
Думаю, ну просто вместо
$userRegName='_A-Za-z0-9 ';
сделаю:
$userRegName='а-яёА-ЯЁ ';

И... не могу зарегистировать себя по-русски.
Стал разбираться. Ну та же проблема с юникодом!
Файл bb_func_checkusr.php
Функция function verifyUsername($uname){}
содержит ряд условий с реглярными выражениями

Вот это условие не пропускало мою фамилию с русской буквой "р". При этом имя Николай пропускало :)

if(!preg_match("#^[".$GLOBALS['userRegName']."]{".$GLOBALS['umin'].",".$GLOBALS['umax']."}\$#", $uname)) return FALSE;

А всего лишь нужно было добавить в эту регулярку доп. команду 'u'
if(!preg_match("#^[".$GLOBALS['userRegName']."]{".$GLOBALS['umin'].",".$GLOBALS['umax']."}\$#u", $uname)) return FALSE;

Author Paul
Lead Developer 
#11 | Posted: 25 Oct 2018 14:05 
Мне кажется, вместо u лучше в изначальную настройку добавить просто ВСЕ кириллические символы и файл сохранить в UTF8. Я так делал на нескольких форумах и это 100% работает для любой кодировки. Как-то с трудом верится, что этот вариант, как у вас, будет работать во всех версиях php. К публичой версии он точно не годится.

Author bestit
Partaker
#12 | Posted: 25 Oct 2018 15:44 
У меня все файлы форума в utf8.
Система форумов с русскоязычными именами входа будет полностью закрытый. Там ограниченный круг людей и все должны быть персонифицированы.

Author Paul
Lead Developer 
#13 | Posted: 25 Oct 2018 16:39 
А в чём смысл HTML темплейты, например, переводить в УТФ? Утф-кодировка нужна только там, где встречаются нелатинские символы из разных языков. И если у вас форум, например, только на русском языке - зачем ему утф? Вы всё правильно считали - в сравнении с нормальной кириллической кодировкой утф занимает в 2 раза больше места, поиск по утф-текстам занимает больше времени. Если у вас только один язык на форуме и нет такого варианта, что, например, в одном тексте будут чешский и русский, то к чему там вообще утф?

Author Paul
Lead Developer 
#14 | Posted: 25 Oct 2018 16:41 
Да, и я не понял, как связаны между собой настройка для кириллических символов и закрытый форум :)

Author bestit
Partaker
#15 | Posted: 27 Oct 2018 19:59 
Здравствуйте, Павел.
Я ответил
bestit:
У меня все файлы форума в utf8.
потому что Вы написали
Paul:
Мне кажется, вместо u лучше в изначальную настройку добавить просто ВСЕ кириллические символы и файл сохранить в UTF8.
Я понял Ваш вариант, указать все русские буквы явным образом: $userRegName='абвгд..............АБВГ.......Я ';

Но в целом, я остался при своем решении:
$userRegName='а-яёА-ЯЁ ';
и добавленном управляющем символе 'u' для регулярного выражения.
Без оного русскую букву 'р' код в файле bb_func_checkusr.php в функция function verifyUsername($uname){} указанное выше регулярное выражение не правильно отрабатывает.

Не очень понимаю, почему когда уже де-факто везде используется юникод, Вы как-то все агитируете за обычную кириллическую кодировку.
:)
Наверное, исторически так сложился код Вашей системы и для полноценного перехода на юникод нужно проделать еще приличное количество работы. И всем нам придется подождать. Но мне кажется, все-таки это верный путь. А пока я для себя что могу и понимаю, переделываю на utf. Естественно, не без Вашей помощи!

p.s. по закрытому форуму я напиши отдельный вопросик, тоже не все складывается как хотелось бы ;)
А пока связь с кириллическим юникодом здесь такая - в этом моем закрытом форум все Логины = Имя Фамилия. Так будет удобно всем участникам этой новой системы форумов, которую я настраиваю сейчас.

Page  Page 1 of 3:  1  2  3  Next » 
Русские miniBB Support Forums / Русские /
 Некорректно работает substr()
 Share Topic's Link

Your Reply Click this icon to move up to the quoted message


  ?
Post as a Guest, leaving the Password field blank. You could also enter a Guest name, if it's not taken by a member yet. Sign-in and post at once, or just sign-in, bypassing the message's text.


Before posting, make sure your message is compliant with forum rules; otherwise it could be locked or removed with no explanation.

 

 
 
miniBB Support Forums Powered by Forum Software miniBB ® Home  Features  Requirements  Demo  Download  Showcase  Gallery of Arts
Compiler  Premium Extensions  Premium Support  License  Contact Us
Try the Captcha add-on: protect your miniBB-forums from the automated spam and flood.


  ⇑