miniBB ® 

miniBB

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

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

 
 
Page  Page 2 of 3:  « Previous  1  2  3  Next »

Author Paul
Lead Developer 
#16 | Posted: 27 Oct 2018 23:04 
bestit:
указать все русские буквы явным образом
Именно так.

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

bestit:
Без оного русскую букву 'р' код в файле bb_func_checkusr.php в функция function verifyUsername($uname){} указанное выше регулярное выражение не правильно отрабатывает.
Каким образом вы это поняли, что именно эту букву?

bestit:
Не очень понимаю, почему когда уже де-факто везде используется юникод, Вы как-то все агитируете за обычную кириллическую кодировку.
Не зря же кодировка windows-1251 существует, как и многие другие. Иметь код и тексты в "родной" кодировке просто и элементарно эффективнее, быстрее по работоспособности. Для исключительно англоязычных форумов и вовсе не нужен никакой уникод.

В нашем случае, на форуме постят со всего мира и на демо-форуме тоже, так что это решение было неизбежным. Но, например, у меня есть пара случаев, когда форум на русском языке и на нём больше миллиона сообщений. Уникод ставить принципиально смысла нет. Одно дело, когда у вас счёт сообщений идёт на тысячи, а другое - когда на миллионы. В последнем случае очень существенно НЕ иметь базу данных, которая будет превышать необходимый вес ровно в два раза и кушать в два раза больше ресурсов при поиске.

Так что никакого "де-факто" в этом плане нет и не может быть.

Author bestit
Partaker
#17 | Posted: 28 Oct 2018 01:38 
Paul:
Каким образом вы это поняли, что именно эту букву?
Практическим методом.
У меня фамилия содержит 'р', а имя не содержит. Мне удавалось регистрировать свое имя и не удавалось фамилию.

Author Paul
Lead Developer 
#18 | Posted: 30 Oct 2018 15:51 
Это довольно странно. Я сейчас добавил на minibb demo следующую настройку:

$userRegName='_абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯA-Za-z0-9&;\# ';
Можете попробовать, получится ли у вас там зарегистрировать никнейм с буквой Р? У меня получилось.
Технически, если всё указано верно, не должно быть такой проблемы.

Author bestit
Partaker
#19 | Posted: 30 Oct 2018 18:27 
Добрый вечер, Павел.

С Вашей "длинной" настройкой все русские буквы нормально работают.

А я то пробовал использовать в переменной обычное регулярное выражение для диапазона:
$userRegName='а-яёА-ЯЁ ';
Вот оно не работает, если не добавить в функцию verifyUsername управляющий символ 'u', указывающий, что используется юникод.

Author Paul
Lead Developer 
#20 | Posted: 30 Oct 2018 19:02 
bestit:
$userRegName='а-яёА-ЯЁ ';
Это не будет корректно работать. Насколько я помню, в классических рег.выражениях нет такого диапазона, да и не может быть, по идее. Он есть только для чисто латинских символов.

В общем, на ваше усмотрение. Либо перечисляете все символы, как я указал, и тогда правки корневого файла не нужны, и 'u', соответственно, тоже. Либо используете свои решения с правками корневого файла.

Сегодня также был обновлён пакет для более верной обработки юзернеймов в уникоде. Похоже, что способ быстрой обработки обрезания строк и нахождения их длин найден :) будет так - если в тексте или фразе есть уникод, то используется спец. функция. Если нет - то стандартные substr, strlen.

mb_substr, по ходу, работает совсем не так, как я себе представлял. Может быть, нужны какие-то доп. установки к нему, что ещё более усложняет жизнь. Но по умолчанию эта функция обрезает текст вовсе не на уникод-символе, а на байте. Может быть, я плохо посмотрел, но текущие функции работают именно так, как нужно.

Author bestit
Partaker
#21 | Posted: 30 Oct 2018 20:11 
Paul:
mb_substr, по ходу, работает совсем не так, как я себе представлял. Может быть, нужны какие-то доп. установки к нему, что ещё более усложняет жизнь.
Я находил информацию, что для корректной работы mb_substr нужно один раз в коде указать:
mb_internal_encoding('UTF-8');
И у меня так корректно работало:
$topics[$tid]['post_text']=mb_substr(strip_tags(str_replace('<br />', "\n", $res[1])), 0, $maxTxtLength);
для addon_1stpagenews2.php

Но, в общем, я послушался Вас и буду использовать модифицированные функции, т.е. без перехода на mb_string

Author bestit
Partaker
#22 | Posted: 30 Oct 2018 21:21 
Внес изменения из обновленного пакета на новый пока пустой форум. Поэтому не все могу пока проверить.
Увидел только, что в мобильной версии буквы некорректно отрезались.
Или пока фикс на мобильную версию не распространяется?
Или я где-то что-то упустил..

UNF8 Name

Author Paul
Lead Developer 
#23 | Posted: 30 Oct 2018 22:48 
Для мобильной я пока ничего не делал. Вообще, во многих местах надо исправлять. Обновления касаются только тем на форумах в полной версии. Все остальное - в след.релизе.

Author bestit
Partaker
#24 | Posted: 31 Oct 2018 12:21 
Добрый день, Павел.
Спасибо, понятно.

Author bestit
Partaker
#25 | Posted: 31 Oct 2018 16:39 
Павел, после установки файлов "обновленного пакета" поломался функционал создания нового форума через админку.
При попытке создания пишет ошибку с кодом $l_error_addforum ("название форума не может быть пустым")
Заменяю пять файлов старыми версиями, создание форума начинает работать.

Author Paul
Lead Developer 
#26 | Posted: 31 Oct 2018 21:54 
Мда... я теперь понимаю, почему движок работал годами. Потому что были приняты к сведению однобайтовые кодировки и запрет на любые символы юзернеймов, кроме латинницы :) очень много всего может вылезать, сообщайте, если найдёте. Движок просто не готов к уникоду ВООБЩЕ. Обновление по той же ссылке. Работы там непочатый край, нужно поднимать фактически все скрипты, может, и справлюсь за месяц... пока не уверен.

Получается так, что функции substr_unicode, strlen_unicode и вероятно в скором будущем, strtolower_unicode нужно включать в bb_functions.php, а не в bb_func_txt.php. Чтоб не таскать за собой горы функций для обработки сообщений, которые для юзернеймов и много где ещё не нужны. Вследствие этого обновления, скорее всего, вам нужно будет убрать блок включения bb_func_txt в недавней версии 1stpagenews.

Также настройкой будет включаться mysqli_set_charset, как вы и предлагали, только я сделал её более гибкой. У меня на локальном сервере не работает уникод вообще, т.к. на нём не написано сайтов :) но это включение помогает сохранять данные корректно, чтобы скрипт их потом успешно находил.

Что касается обновления для мобильной версии, то в bb_plugins код, где упоминается $user_usr_disp, нужно поменять вот на этот:

if(strlen_unicode($user_usr)<=15) $user_usr_disp=$user_usr; else $user_usr_disp=substr_unicode($user_usr, 0, 15).'...';
С этими обновлениями, по крайней мере, у себя я смог зарегистрировать юзернейм в кириллице, войти с ним и добиться того, чтоб он урезался корректно в мобильной версии. Но пока что это всё :) bb_func_checkusr.php нуждается ещё в правках для уникода. Функция count_chars работает только для однобайтовых символов. Ещё по мелочам там много проверок нуждаются в доработке.

Уникод заметно, заметно осложняет жизнь :) шляпа полная. Я даже не понимаю, как ваш старый форум корректно в нём работает. Это какая-то мистика.

Author Paul
Lead Developer 
#27 | Posted: 2 Nov 2018 00:41 
Прошёлся сегодня по файлам основной версии и беру свои слова обратно... работы не очень много, учитывая, что во многих местах substr, strlen используются для исключительно системных значений, которые заведомо не могут быть unicode, так что обновления там не требуются.

Я обновил дистрибутив; полагаю, что обновлений для уникода там больше не требуется. В функциях *_unicode (bb_functions.php) я всё-таки добавил функции mb_* по умолчанию, т.к. при их наличии это самый быстрый и верный вариант. Также эти функции можно переписать под нужды определённых кодировок, коих может быть уйма. По умолчанию они для utf-8 и вроде бы работают.

В течение ближайших дней "дожму" остальные исправления текущей версии и тогда будет окончательный релиз версии 3.3.1. Исправления по уникоду в аддонах тогда уже потом.

Важные замечания, с которыми я не могу тут не поделиться, касаются поиска и регистронезависимых логинов в уникоде. Если mySQL не настроен на то, чтобы в нём работала функция lower в отношении уникод-значений, это означает, что при логине нужно будет вводить юзернейм как он указан при регистрации, со всеми строчными и заглавными буквами. И поиск по сообщениям будет находить только тот текст, в котором поисковая фраза встречается "как есть". Например, поиск по слову "трактор" ничего не даст, если в сообщении указано слово "Трактор".

Повторюсь, что при верной конфигурации mySQL всё это должно, по идее, работать. Но если не будет работать, то в PHP это уже не исправить никак.

Author bestit
Partaker
#28 | Posted: 2 Nov 2018 13:03 
Добрый день, Павел.
Спасибо за добрые новости!

Правда, я вчера уже применил предыдущее обновления и вроде все заработало как нужно.
Значит, придется еще раз это дело повторить.
:)

Единственное, при применении файла setup_mysqli.php на работающем форуме вместо русских букв отображаются ????????
Вернул пока свой файл (где дописана была одна строка: mysqli_set_charset($mysqlink, "utf8");

Приложил картинку сравнения вариантов файла.
mysqli

Author bestit
Partaker
#29 | Posted: 2 Nov 2018 13:11 
Что касается поиска, то да периодически мне было не понятно, почему он что-то не может найти.
Вот результат тестов на новом форуме, где пока опубликовано только одно сообщение.

Имя пользователя ищет без учета регистра (проверял в админке).
username search

Слово из сообщения находит и так и так. Только если точное совпадение (с учетом регистра), то подсвечивается полужирным все это слово.

searching in posts

searching in posts

Тему вообще никак не может найти...

topics search

Author bestit
Partaker
#30 | Posted: 2 Nov 2018 13:38 

Page  Page 2 of 3:  « Previous  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
Check out the Captcha add-on: protect your miniBB-forums from the automated spam and flood.


  ⇑