Опять проблема с кодировкой

Тема в разделе "ExpressionEngine", создана пользователем alexo, 17 дек 2008.

Статус темы:
Закрыта.
  1. alexo

    alexo

    Регистр.:
    28 май 2006
    Сообщения:
    311
    Симпатии:
    5
    Привет

    Знаю, что проблема старая, да и я сам кажется пару раз этот вопрос задавал и что самое странное, что всё было ОК.

    Пока в очередной раз не сталкнулся с очередным сайтом с той же проблемой.

    Сейчас коротко что к чему.

    Сайт в юникоде кодировка -UTF8

    Зная, как бороться с этой проблемой изначально поставил все настройки как надо.

    1.System Preferences -General Configuration - UTF-8

    2. CP Home › Admin › Weblog Administration › Weblog Management › Edit Weblog - XML Character Encoding - UTF-8


    3, db/db.mysql.php
    in Connect to database

    Код:
        /** ---------------------------------------    
        /**  Connect to database
        /** ---------------------------------------*/
        
        function db_connect($select_db = TRUE)
        {    
            $this->conn_id = ($this->conntype == 0) ?
              @mysql_connect ($this->hostname, $this->username, $this->password):
              @mysql_pconnect($this->hostname, $this->username, $this->password);
            
            if ( ! $this->conn_id)
            {            
                return FALSE;        
            }
            
            if ($select_db == TRUE)
            {
                if ( ! $this->select_db())
                {
                    return FALSE;    
                }
            }
            
    $this->query("SET NAMES 'utf8'");
    $this->query("SET CHARACTER SET utf8");
    $this->query("SET COLLATION_CONNECTION=utf8_general_ci");
            
            return TRUE;
        }
        /* END */
    4. текст строго в юникоде вводиться

    ---------------
    в админке всё ок, но в базе (и в пхпадмин) и если смотрю файл сурс - идет текск такого рода

    ------------
    пролистал мейн форум - сделал всё когда то, кто то кому советовали (имею ввиду дельные советы :nezn:)
    1. база строга -в Collation - utf8_general_ci
    2. переконвертировал всю базу через этот скрипт

    Код:
    <?php
    // Fill in your configuration below
    $db_server      = 'localhost';
    $db_user      = '**';
    $db_password   = '**';
    $db_name      = '***';
    
    // Do not change anything below this
    // set_time_limit(0);
    header('Content-type: text/plain');
    
    $connection = mysql_connect($db_server, $db_user, $db_password) or die( mysql_error() );
    $db = mysql_select_db($db_name) or die( mysql_error() );
    
    $sql = 'SHOW TABLES';
    if ( !($result = mysql_query($sql)) )
    {
       print '<span style="color: red;">SQL Error: <br>' . mysql_error() . "</span>\n";
    }
    
    // Loop through all tables in this database
    while ( $row = mysql_fetch_row($result) )
    {
       $table = mysql_real_escape_string($row[0]);
       $sql2 = "ALTER TABLE $table DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci";
       
       if ( !($result2 = mysql_query($sql2)) )
       {
          print '<span style="color: red;">SQL Error: <br>' . mysql_error() . "</span>\n";
          
          break;
       }
       
       print "$table changed to UTF-8 successfully.<br>\n";
    
       // Now loop through all the fields within this table
       $sql3 = "SHOW COLUMNS FROM $table";
       if ( !($result3 = mysql_query($sql3)) )
       {
          print '<span style="color: red;">SQL Error: <br>' . mysql_error() . "</span>\n";
          
          break;
       }
    
       while ( $row3 = mysql_fetch_row($result3) )
       {
          $field_name = $row3[0];
          $field_type = $row3[1];
          
          // Change text based fields
          $skipped_field_types = array('char', 'text', 'blob', 'enum', 'set');
          
          foreach ( $skipped_field_types as $type )
          {
             if ( strpos($field_type, $type) !== false )
             {
                $sql4 = "ALTER TABLE $table CHANGE `$field_name` `$field_name` $field_type CHARACTER SET utf8 COLLATE utf8_bin";
                if ( !($result4 = mysql_query($sql4)) )
                {
                   print '<span style="color: red;">SQL Error: <br>' . mysql_error() . "</span>\n";
                   
                   break 3;
                }
                print "---- $field_name changed to UTF-8 successfully.<br>\n";
             }
          }
       }
       print "<hr>\n";
    }
    
    mysql_close($connection);
    ?>
    не помогло, под конец весь текст из базы ручную перевёл в юникод прямо в пхпадмине.

    на вид всё ок, но когда добавляю ню entry - текст опять такого рода

    подскажите, что я не правильно делаю, или что ещё я не сделал ?
     
  2. a11i3n

    a11i3n Создатель

    Регистр.:
    10 июл 2007
    Сообщения:
    42
    Симпатии:
    12
    Попробуй так.

    $db->Execute("SET character_set_database=UTF8");
    $db->Execute("SET character_set_client=UTF8");
    $db->Execute("SET character_set_connection=UTF8");
    $db->Execute("SET character_set_results=UTF8");
    $db->Execute("SET character_set_server=UTF8");
    $db->Execute("SET names UTF8");

    саму базу(и таблицу) преведи в utf_general_ci (как-то так вроде бы)
    только вот у себя так победил)
     
  3. alexo

    alexo

    Регистр.:
    28 май 2006
    Сообщения:
    311
    Симпатии:
    5
    скрипт выше как раз уже сделал это, но всё равно даже новый текст(статья) добавляется таким же макаром (через & # 1377; & # 1404; )

    Добавлено через 4 минуты
    кстати куда этот код ставить
     
  4. a11i3n

    a11i3n Создатель

    Регистр.:
    10 июл 2007
    Сообщения:
    42
    Симпатии:
    12
    попробуй заменить вот эти строчки в db/db.mysql.php
    $this->query("SET NAMES 'utf8'");
    $this->query("SET CHARACTER SET utf8");
    $this->query("SET COLLATION_CONNECTION=utf8_general_ci");

    на

    $this->query("SET character_set_database=UTF8");
    $this->query("SET character_set_client=UTF8");
    $this->query("SET character_set_connection=UTF8");
    $this->query("SET character_set_results=UTF8");
    $this->query("SET character_set_server=UTF8");
    $this->query("SET names UTF8");
     
  5. ppr

    ppr Постоялец

    Регистр.:
    2 апр 2006
    Сообщения:
    68
    Симпатии:
    20
    Если я правильно понял

    Collation Вы изменили. А сами таблицы?

    Я имею в виду не контент, который Вы изменили, а кодировку таблиц. Полагаю, она по-прежнему Latin1.

    А должно быть:

    Код:
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    Сделайте дамп БД и посмотрите, у Вас CHARSET=utf8 в этой строке?

    Предполагаю, Вы поздно Collation изменили. Теперь и CHARSET надо изменить у всех таблиц вручную.
     
  6. kharol

    kharol Постоялец

    Регистр.:
    10 фев 2008
    Сообщения:
    136
    Симпатии:
    47
    Все верно, так быстрее разберетесь где у Вас не UTF-8.
    Еще пропишите строку принудительной кодировки в .htaccess (для теста, измениться ли что-нибудь или нет). Damp делайте не через phpMyAdmin, а например используя dumper.php. Тогда исключается возможность некорректной работы phpMyAdmin с MySQL. (такое бывает из-за неадаптированности панели администрирования (ранних версий) к версии MySQL)
     
  7. alexo

    alexo

    Регистр.:
    28 май 2006
    Сообщения:
    311
    Симпатии:
    5
    я на 99% помню, что CHARSET=utf8 в каждой строке (смотрел дамп несколько дней назад).
    прописал в самом начале

    ещё с пмашин, когда база стала большая, phpMyAdmin стал украшением в этом смысле
     
  8. ppr

    ppr Постоялец

    Регистр.:
    2 апр 2006
    Сообщения:
    68
    Симпатии:
    20
    Только что обратил внимание на Ваш код.

    Я делаю несколько иначе.

    Попробуйте заменить

    Код:
    $this->query("SET NAMES 'utf8'");
    на

    Код:
    $this->server_info = @mysql_get_server_info();
    mysql_query("SET NAMES 'utf8'");
     
  9. mxnr

    mxnr Постоялец

    Регистр.:
    7 июн 2007
    Сообщения:
    134
    Симпатии:
    39
    а я вот чего не пойму - развели тут целую ветку каких-то рецептов о UTF-8... А у человека в базе - ASCII кода. Они в принципе не могут образоваться из-за проблем с UTF-8. Зато в EE есть настройки, которые позволяю записи сохранять в данном формате и соответственно выключать данный режим.
     
  10. kharol

    kharol Постоялец

    Регистр.:
    10 фев 2008
    Сообщения:
    136
    Симпатии:
    47
    Ну если не поймешь, то не стоит со своими комментами в умного играть. Разговор не столько о том, чем это вызвано, сколько о том как быть человеку, чтобы работало как надо и не вызывало неприятностей. Я сам с EE не работал, но умничать постеснялся бы, а показал бы пальцем человеку где эти настройки.
    To:alexo
    Не расстраивайся, решим твою проблему. Глобальное решение изменения кодировки в EE возможно. Почитай вот эту дельную статью
     
Статус темы:
Закрыта.