Пропадает половина или весь пост при записи. Буква "Ер".

Started by bhagavan, June 24, 2008, 04:58:23 PM

Previous topic - Next topic

bhagavan

Здравствуйте!
Каждый раз, когда в посте появляется большая буква "эр" ("Р"), это приводит к обрезке содержимого поста - постится с записью в базу данных только то, что было до буквы "Р" - всё что после (включая и саму букву "Р") - пропадает :).

Для отладки в файл Subs-Post.php в тело функции preparsecode()  дописал оператор
$message = str_replace('Р','R',$message);, который должен заменять все вхождения буквы "ЭР" на английскую "R" и постепенно  продвигал ёё вниз по коду функции preparsecode()...

До строчек // Now that we've fixed all the code tags, let's fix the img and url tags...
$parts = preg_split('~(\[/code\]|\[code(?:=[^\]]+)?\])~i', $message, -1, PREG_SPLIT_DELIM_CAPTURE);


всё действовало (вместо слова "ПРОСТО" получал "ПRОСТО"), а после  этих строк сигнальная замена действовать перестала - получал на выходе одну только букву "П" - после "Р" все как отрезано...

Может кто-то объяснить, что там происходит в той строчке? Я так понимаю, что строка разбивается на масив подстрок, но не понимаю по какому признаку и каким образом оно может спотыкатся о букву "Р" :(

П.С. Форум переведен на УТФ  (было 1251 )- проблемы начались после перехода на юникод.


bhagavan

Quote from: rtyug on June 28, 2008, 03:16:23 AM
по-моиму вы гоните  :)


хм... вообще то я бы непротив "погнать"... но если отбросить кажущуюся невероятность происходящего, то что-тут такого необычного - если скрипт каким то образом неправильно отрезает кусок поста по причине случайного совпадения регулярного выражения и куска десятичного кода символа "Ер" или целого символа....

Может надо какие-то файлы в УТФ перевести или что-то похожее... а в регулярных выражениях и юникодовых символах вообще не разбираюсь, как и в ПХП... и то мне это все не кажется таким уж загадочным :).

Могу дать попробовать в полевых условиях :) на тестовом акаунте (правда там сейчас действует замена Р => R), но могу временно убрать.

†MavN†

версия mysql у вас какая кодировка бд кодировка сопоставлений?
такая проблема имела место быть в раних версиях smf только на сколько мне помнится затрагивалась не только буква Р но и еще как 2 только не помню какие.

bhagavan

Есть интуитивная догадка, что по каким-то соображениям юникодовый (предположительно 4-байтовый) символ "Р" обрабатывается как два двухбайтовых символа, из-за чего и возникает коллизия... вот если бы кто рассказал, что там --- в тех регулярных выражениях :)

2 †MavN†:

Версия сервера: 4.1.22-standard-log
MySQL Charset:  UTF-8 Unicode (utf8)
MySQL connection collation: utf8_unicode_ci

Раньше форум был на cp1251 и размещался в поддиректории у джумлы. Из-за этого были проблемы с сессиями - в ІЕ не работала Капча и регистрация. А также из-за дописок и модов не хотел устанавливаться апдейт (1.1.4 => 1.1.5).
Таким образом я просто установил новый форум на отдельный поддомен и импортировал в него старую базу данных, конвертировал текстовый SQL-дамп из 1251 в utf8. Всё зароботало с полуоборота, подправил только файлики BoardIndex.php, Subs.php - неработала обрезка названия тем для отображения в BoardIndex - заменил substr() на mb_substr(), и strlen() на mb_strlen().

Извините, если что не так напартачил :)

†MavN†

Проблема с обрезанием действительно имеет место быть.
у нас решение вот такое
Sources/Subs.php
надо функцию изменить на


function shorten_subject($subject, $len)
{
//smfrc changes
    global $func;

    // It was already short enough!
    if ($func['strlen']($subject) <= $len)
        return $subject;
$subject=mb_convert_encoding($subject,'CP1251','UTF-8');
    // Shorten it by the length it was too long, and strip off junk from the end.
//    return $func['substr']($subject, 0, $len) . '...';
$subject=$func['substr']($subject, 0, $len) . '...';
$subject=mb_convert_encoding($subject,'UTF-8','CP1251');
return $subject;
}

bhagavan

Я обрезку сделал так:
function shorten_subject($subject, $len)
{
//global $func;

// It was already short enough!
if (mb_strlen($subject) <= $len)
return $subject;

// Shorten it by the length it was too long, and strip off junk from the end.
return mb_substr($subject, 0, $len) . '...';
}


Не знаю как лучше.

Но вот, что  я подумал. А что если мне $message ()так же кодировать в 1251 функцией mb_convert_encoding перед обработкой (на предмет той злосчастной буквы "ЭР") prepasecode() а потом обратно в УТФ?

или лучше не надо? :)


bhagavan

там оказывается перед некоторыми действиями со строками догадались проверку на юникодовость строк делать ("$context['utf8'] ?"  насколько я понял). Скрипт от такой солянки, когда контекст юникодовый а строка 1251 буде в осадок выпадать наверное :)... но попробую...

будут идеи, пишите, пожалуйста... а то если не получиться, придется опять мигрировать на эту 1251, а чё-то не хочется :(.

bhagavan

А можно создать аналогичную тему на английском "диалекте" в соотетствующем разделе? Правилами не запрещены "интернациональные дубликаты"?


bhagavan

Проблему решил запуск ?action=convertentities

// Convert HTML-entities to their UTF-8 character equivalents.
function ConvertEntities()


Кто-то обяснит почему, или принять, как подарок - в зубы не заглядывая? :)

Advertisement: