miniBB ®

miniBB

®
Support Forums
  
 · Start · Sign in · 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:47Reply Quote
Функция 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 Lead Developer
#2 · Posted: 11 Oct 2018 20:51Reply Quote
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:49Reply Quote
Спасибо, Павел.
Согласен про серверные настройки, скачал фикс, буду проверять.

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

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

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

Author bestit
Partaker
#6 · Posted: 19 Oct 2018 12:42Reply Quote
просто поменять функцию 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 Lead Developer
#7 · Posted: 24 Oct 2018 13:18Reply Quote
Вы всё правильно, по сути, делали, только с путями не разобрались :)

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

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

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

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

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

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

А на проблему с 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:15Reply Quote
Вот еще пример, где нужно учитывать юникод.

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

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

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

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

Author bestit
Partaker
#15 · Posted: 27 Oct 2018 19:59Reply Quote
Здравствуйте, Павел.
Я ответил
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

BB code for the Bold StyleBB code for the Italic StyleBB Code for the PictureBB code for the URLUpload a File

  ?
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
Proceed with the File and Picture Attachments add-on: extend your miniBB-forums, attaching images and files.