За последние 24 часа нас посетили 17565 программистов и 1724 робота. Сейчас ищут 1597 программистов ...

utf-8, phpBB

Тема в разделе "PHP и базы данных", создана пользователем Danilevsky, 21 апр 2006.

  1. Danilevsky

    Danilevsky Активный пользователь

    С нами с:
    12 фев 2006
    Сообщения:
    286
    Симпатии:
    0
    Адрес:
    Киев
    Здравствуйте.

    WinXP, Apache2, MySQL - 5.0.19-nt, PHP 5.1.2

    Устанавливаю phpBB (v2.0.20). Русская верися форума в кодировке windows-1251, а мне его нужно установить в utf-8 по причине многоязычности форума. Сами файлы phpBB немного пришлось подкоректировать (поставить нужную кодировку) и собственно перекодировать их в utf-8. База данных соответственно тоже была создана в utf-8 и collation utf8_unicode_ci.

    На первый взгляд после установки все работало просто отлично. и русский и более экзотичные языки отображались на форуме без всяких проблем. Но потом, просмотревши базу данных форума в phpMyAdmin я увидел, что нелатинские символы отображаются неправильно (абракадабра), но при этом всем форум работает отлично.

    Первыми действиями было в скрипте соединения с базой данных поставить mysql_query("SET NAMES utf8"); После переустановки форума захожу в phpMyAdmin - все стало отображаться правильно.

    Но появилась проблема: при регистрации нового пользователя с нелатинским ником форум мне выдает что такой пользователь уже существует. Но в тоже время если убрать строку mysql_query("SET NAMES utf8"); форум начинает работать нормально...

    Один человек мне сказал, что это типа phpMyAdmin неправильный, что он с юникодом работать не может. Вот меня и интересует вопрос что работает не правильно?
    Заранее спасибо за ваши мнения!
     
  2. Danilevsky

    Danilevsky Активный пользователь

    С нами с:
    12 фев 2006
    Сообщения:
    286
    Симпатии:
    0
    Адрес:
    Киев
    Только что попробал установить форум на сервере провайдера
    со строкой mysql_query("SET NAMES utf8"); пашет на ура.
    Значит это зависит от настроек сервера...
    Что нетак?

    провайдер: FreeBSD, Apache 1.33 , PHP 4.3.11, MySQL 4.1.11
     
  3. Danilevsky

    Danilevsky Активный пользователь

    С нами с:
    12 фев 2006
    Сообщения:
    286
    Симпатии:
    0
    Адрес:
    Киев
    Проблема этого чертового форума остается нерешенной:
    русский ник пользователя обрезается вдвое. но теперь это делает не база данных. Тоесть это делает сам php. насколько я понял проблема кроется в строковых функциях, которые не коректно работают с юникодом.
    Пробовал в htaccess писать строку "php_value mbstring.func_overload 6" и "php_value mbstring.func_overload 7". Но это привело к тому что во время регистрация русского пользователя форум выдает что такое пользователь уже есть...
    Уважаемые специалисты, помогите пожалуйста. У меня уже сил нет бороться с этим чертовым юникодом и phpBB!!
     
  4. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    Danilevsky
    лично мне разбираться с этим phpBB нету ни желания ни сил.
    ты уж прости ...
    в чем другом помогу с удовольствием.

    p.s. есть официальный форум поддержки этого продукта. надо поднять этот вопрос там, т.к. там есть техподдержка.
     
  5. Danilevsky

    Danilevsky Активный пользователь

    С нами с:
    12 фев 2006
    Сообщения:
    286
    Симпатии:
    0
    Адрес:
    Киев
    Всему виной б..ть эти йо....ые строки:

    PHP:
    1. function phpbb_clean_username($username)
    2. {
    3.    $username = substr(htmlspecialchars(str_replace("\'", "'", trim($username))), 0, 25);
    4.    $username = phpbb_rtrim($username, "\\");
    5.    $username = str_replace("'", "\'", $username);
    6.  
    7.    return $username;
    8. }
    9.  
    10. function phpbb_rtrim($str, $charlist = false)
    11. {
    12.    if ($charlist === false)
    13.    {
    14.       return rtrim($str);
    15.    }
    16.    
    17.    $php_version = explode('.', PHP_VERSION);
    18.  
    19.    // php version < 4.1.0
    20.    if ((int) $php_version[0] < 4 || ((int) $php_version[0] == 4 && (int) $php_version[1] < 1))
    21.    {
    22.       while ($str{strlen($str)-1} == $charlist)
    23.       {
    24.          $str = substr($str, 0, strlen($str)-1);
    25.       }
    26.    }
    27.    else
    28.    {
    29.       $str = rtrim($str, $charlist);
    30.    }
    31.  
    32.    return $str;
    33. }