MySQL кодировка!

Статус
В этой теме нельзя размещать новые ответы.

CnecHa3

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

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

помогите добрые жители нуллед.вс :)
 
надо проверить кодировку базы и кодировку указанную в скрипте вывода, видимо они различны
 
PHP:
mysql_query("set names cp1251");
 
файл: utf-8
мускул: cp1251

использую tinymce 3.*
и все равно(
 
юзай iconv('UTF-8', 'windows-1251', $str), он переведет в нужную кодировку
 
есть решения:
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:
 
А не проще перейти польность на UTF-8 иль на юникод, и не будет таких проблем, а то получаются танцы с бубнами :)
 
С кодировками все переодически мучаются, даже профи ;)
Проверь соответствует ли кодировка сайта, кодировке базы.
Если не поможет, принудительно измени кодировку, после инициализации соединения с таблицей. Как уже a_n_d_y написал.
mysql_query("SET NAMES 'cp1251'"); или
mysql_query("SET NAMES 'utf-8'");
смотря, что надо.
 
надо было мне написать скрипт который конвертирует некоторые таблицы, и затем переносит в другую базу, были проблемы с кодировкой, ниче не помагало, ни 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), вот так надо записывать в базу чтоб нормально читалось
 
надо было мне написать скрипт который конвертирует некоторые таблицы, и затем переносит в другую базу, были проблемы с кодировкой, ниче не помагало, ни 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), вот так надо записывать в базу чтоб нормально читалось

если 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;
}
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху