MySQL кодировка!

Тема в разделе "Базы данных", создана пользователем CnecHa3, 25 сен 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. CnecHa3

    CnecHa3 Постоялец

    Регистр.:
    10 фев 2007
    Сообщения:
    105
    Симпатии:
    20
    я точно не знаю к какому разделу отнести даную тему!
    ну ладно.

    у меня такая проблема....
    если вводишь русский текст он базу записывается по-русский но когда надо вывести текст на сайт я вижу "знаки вопроса в ромбике"

    помогите добрые жители нуллед.вс :)
     
  2. random73

    random73 Создатель

    Регистр.:
    5 сен 2008
    Сообщения:
    13
    Симпатии:
    1
    надо проверить кодировку базы и кодировку указанную в скрипте вывода, видимо они различны
     
  3. a_n_d_y

    a_n_d_y

    Регистр.:
    26 мар 2006
    Сообщения:
    465
    Симпатии:
    61
    PHP:
    mysql_query("set names cp1251");
     
  4. CnecHa3

    CnecHa3 Постоялец

    Регистр.:
    10 фев 2007
    Сообщения:
    105
    Симпатии:
    20
    файл: utf-8
    мускул: cp1251

    использую tinymce 3.*
    и все равно(
     
  5. pslava

    pslava

    Регистр.:
    16 май 2007
    Сообщения:
    618
    Симпатии:
    122
    юзай iconv('UTF-8', 'windows-1251', $str), он переведет в нужную кодировку
     
  6. Avtolik55

    Avtolik55 Писатель

    Регистр.:
    19 сен 2008
    Сообщения:
    4
    Симпатии:
    0
    есть решения:
    PHP:
    function detectUTF8($string)
    {
            return 
    preg_match('%(?:
            [\xC2-\xDF][\x80-\xBF]        # non-overlong 2-byte
            |\xE0[\xA0-\xBF][\x80-\xBF]               # excluding overlongs
            |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}      # straight 3-byte
            |\xED[\x80-\x9F][\x80-\xBF]               # excluding surrogates
            |\xF0[\x90-\xBF][\x80-\xBF]{2}    # planes 1-3
            |[\xF1-\xF3][\x80-\xBF]{3}                  # planes 4-15
            |\xF4[\x80-\x8F][\x80-\xBF]{2}    # plane 16
            )+%xs'
    $string);
    }

    function 
    cp1251_utf8$sInput )
    {
        
    $sOutput "";

        for ( 
    $i 0$i strlen$sInput ); $i++ )
        {
            
    $iAscii ord$sInput[$i] );

            if ( 
    $iAscii >= 192 && $iAscii <= 255 )
                
    $sOutput .=  "&#".( 1040 + ( $iAscii 192 ) ).";";
            else if ( 
    $iAscii == 168 )
                
    $sOutput .= "&#".( 1025 ).";";
            else if ( 
    $iAscii == 184 )
                
    $sOutput .= "&#".( 1105 ).";";
            else
                
    $sOutput .= $sInput[$i];
        }
       
        return 
    $sOutput;
    }

    function 
    encoding($string){
        if (
    function_exists('iconv')) {   
            if (@!
    iconv('utf-8''cp1251'$string)) {
                
    $string iconv('cp1251''utf-8'$string);
            }
            return 
    $string;
        } else {
            if (
    detectUTF8($string)) {
                return 
    $string;       
            } else {
                return 
    cp1251_utf8($string);
            }
        }
    }
    echo 
    encoding($string);
    :yahoo:
     
  7. DIAgen

    DIAgen Постоялец

    Регистр.:
    30 окт 2006
    Сообщения:
    134
    Симпатии:
    72
    А не проще перейти польность на UTF-8 иль на юникод, и не будет таких проблем, а то получаются танцы с бубнами :)
     
  8. ArtFun

    ArtFun Постоялец

    Регистр.:
    6 фев 2008
    Сообщения:
    139
    Симпатии:
    21
    С кодировками все переодически мучаются, даже профи ;)
    Проверь соответствует ли кодировка сайта, кодировке базы.
    Если не поможет, принудительно измени кодировку, после инициализации соединения с таблицей. Как уже a_n_d_y написал.
    mysql_query("SET NAMES 'cp1251'"); или
    mysql_query("SET NAMES 'utf-8'");
    смотря, что надо.
     
  9. slik_jay

    slik_jay ^_^

    Регистр.:
    24 май 2008
    Сообщения:
    50
    Симпатии:
    27
    надо было мне написать скрипт который конвертирует некоторые таблицы, и затем переносит в другую базу, были проблемы с кодировкой, ниче не помагало, ни iconv, ни другие методы.. потому я схитрил, в при записи в другу базу пропускал текст кириличный через вот такую функцию, и все заработало:
    Код:
    function conv($str)
    {
        if(!strlen($str))
            return "''";
        $tmp = "CHAR(";
        for($i=0, $j=strlen($str); $i<$j; ++$i)
            $tmp .= ord($str[$i]).",";
        $tmp = substr($tmp, 0, -1).")";
        return $tmp;
    }
    
    она концертирует текст в строку типа CHAR(242,229,234,241,242), вот так надо записывать в базу чтоб нормально читалось
     
  10. skabbit

    skabbit Постоялец

    Регистр.:
    6 дек 2007
    Сообщения:
    88
    Симпатии:
    1
    если CHAR(), то какой в этом смысл? :\ он же всё равно кодировочные преобразования применит.

    может в конкретном случае это помогло, но тут человеку имхо надо посоветовать сайт в utf-8 перекинуть целиком и навсегда забыть о всех проблемах с кодировками (кроме проблемы сапы, которая не умеет сама распознавать кодировку сайта даже по специальным тегам. только если ей пальцем не показать).

    топикстартеру советую сделать так:
    все массивы, хеши, переменные и т.п., которые получаешь из БД, прогонять предварительно через функцию
    PHP:
    function convert_all($var$in_charset "UTF-8"$out_charset "cp1251")
    {
        if (
    is_array($var)) {
            
    $new = array();
            foreach (
    $var as $k => $v) {
                
    $new[convert_all($k)] = convert_all($v);
            }
            
    $var $new;
        } elseif (
    is_object($var)) {
            
    $vars get_class_vars(get_class($var));
            foreach (
    $vars as $m => $v) {
                
    $var->$m convert_all($v);
            }
        } elseif (
    is_string($var)) {
            
    $vart iconv($in_charset$out_charset$var);
            
    $var $vart;
        }
        return 
    $var;
    }
     
Статус темы:
Закрыта.