Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Непонятные глюки с кодировкой и транслитом

439
21 января 2010 года
Rexulnik
217 / / 09.02.2005
Доброго времени суток!
Делаю вроде казалось бы тривиальную задачу - транслит строки для ссылок тэгов в блоге.
Но непонятный глюк возник: символы кириллицы куда-то теряются в кодировке... Коды символов абсолютно одинаковые при сравнении, но сами символы теряются и не сравниваются... Так происходит только с кириллицей, латинские буквы и знаки препинания нормально проходят, сами символы нормально проходят если их брать чисто из поста, а если их попробовать переконвертировать получается бред, и кстати разная длина строки, символов к примеру 30, а strlen показывает шо их 59... Но строка вроде как в UTF-8, Content-Type тоже UTF-8, в посте всё нормально, кодировка файлов скриптов тоже UTF-8, конвертил через iconv и уже всё перепробовал... Тривиальная задача такая, тысячу раз делал, но сейчас без понятия, что происходит...
Кто-то может знает в чём может быть прикол?
253
21 января 2010 года
Proger_XP
1.5K / / 07.08.2004
Покажи код, где ты их переконверчиваешь.
439
21 января 2010 года
Rexulnik
217 / / 09.02.2005
Цитата: Proger_XP
Покажи код, где ты их переконверчиваешь.



вот одну функцию пробовал:

Код:
function Russian2lat($char)
{
    if (strpos('"\'=+&()^%$#@!`~№;%:?*//*\\', $char) === false)
    {
        switch ($char)
        {
        case 'А':
        case 'а':
            return 'a';
            break;
        case 'Б':
        case 'б':
            return 'b';
            break;
        default:
            return $char;
        ...
        }
    }
    else
        return '';
}

потом вот так конвертил
 
Код:
...
    $keywords = mysql_escape_string($_POST['keywords']);
    $kw_link = '';
    $length = strlen($keywords);
    for ($i = 0; $i < $length; $i ++)
        $kw_link .= Russian2lat($keywords[$i[);
...

вторую
 
Код:
function translateToLat($string)
{
    $russian = array('ё','ж','ц','ч','ш','щ','ю','я','Ё','Ж','Ц','Ч','Ш','Щ','Ю','Я');
    $latin = array('yo','zh','tc','ch','sh','sh','yu','ya','YO','ZH','TC','CH','SH','SH','YU','YA');
    $string = str_replace($russian,$latin,$string);
    $string = strtr($string,"АБВГДЕЗИЙКЛМНОПРСТУФХЪЫЬЭабвгдезийклмнопрстуфхъыьэ","ABVGDEZIJKLMNOPRSTUFH_I_Eabvgdezijklmnoprstufh_i_e");
     
    return($string);
}

и потом:
 
Код:
...
    $keywords = mysql_escape_string($_POST['keywords']);
    $kw_link = translateToLat($keywords);
...

и в результате получается каша какая-то в $kw_link...
при чём в переменной $keywords всё нормально.
кстати в первом варианте всё проходит мимо switch, попадая сразу в default...
253
21 января 2010 года
Proger_XP
1.5K / / 07.08.2004
Попробуй utf8_de/encode() если у тебя строки в нем.
439
21 января 2010 года
Rexulnik
217 / / 09.02.2005
Цитата: Proger_XP
Попробуй utf8_de/encode() если у тебя строки в нем.



попробовал вот так:

 
Код:
$kw_link = utf8_decode(translateToLat($keywords));

и так:
 
Код:
$kw_link = iconv('ISO-8859-1', 'UTF-8', utf8_decode(translateToLat($keywords)));

каждый раз получаются разные варианты, но всё равно какая-то билиберда... всё вроде как в UTF-8... но способа ж проверить кодировку вроде как нет, так что не уверен... но всё везде вроде в нём... что-то несусветное со строкой происходит
2.2K
21 января 2010 года
REFOT
181 / / 08.04.2005
попробуй так:

 
Код:
$kw_link = translateToLat(utf8_decode($keywords));


и так:

 
Код:
$kw_link = iconv('UTF-8', 'ISO-8859-1', $keywords);
$kw_link = translateToLat($kw_link);
439
21 января 2010 года
Rexulnik
217 / / 09.02.2005
Цитата: REFOT
попробуй так:

 
Код:
$kw_link = translateToLat(utf8_decode($keywords));


и так:

 
Код:
$kw_link = iconv('UTF-8', 'ISO-8859-1', $keywords);
$kw_link = translateToLat($kw_link);



не работают оба... а второй вообще пустую строку возвращает, так же не работает ни utf8_decode ни utf8_encode... блин шо ж такое... может шото глобальней с заголовками пакета или ещё каким-то бредом? потому шо коды символы те же... такое впечатление, шо глюк PHP или Apache...

2.2K
21 января 2010 года
REFOT
181 / / 08.04.2005
Открой php-шный файл с помощью блокнота, выбери ФАЙЛ-СОХРАНИТЬ КАК и выставь кодировку UTF-8...
Возможно поможет )
439
21 января 2010 года
Rexulnik
217 / / 09.02.2005
Цитата: REFOT
Открой php-шный файл с помощью блокнота, выбери ФАЙЛ-СОХРАНИТЬ КАК и выставь кодировку UTF-8...
Возможно поможет )



уже пробовал, и в дримуивере ставил кодировку страницы UTF-8...

2.2K
21 января 2010 года
REFOT
181 / / 08.04.2005
Так...
в $_POST['keywords'] - строка в UTF-8 ? Если так то нужно использовать mysql_real_escape_string().
253
21 января 2010 года
Proger_XP
1.5K / / 07.08.2004
Если не знаешь, что в какой кодировке, попробуй просто сделать die($_POST['...']); до всякого вывода (и не выводи content-type), и посмотри, какую кодировку тебе выставит браузер при автоопределении.
439
21 января 2010 года
Rexulnik
217 / / 09.02.2005
Цитата: REFOT
Так...
в $_POST['keywords'] - строка в UTF-8 ? Если так то нужно использовать mysql_real_escape_string().



а mysql_escape_string разве хуже?

253
21 января 2010 года
Proger_XP
1.5K / / 07.08.2004
Цитата:
а mysql_escape_string разве хуже?


Хуже, именно поэтому есть ее real-версия. real заменяет специальные символы, опираясь на кодировку соединения, а mysql_escape_string их пропустит. Кстати,

Цитата:

mysql_escape_string:
This function has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 6.0.0. Relying on this feature is highly discouraged.

439
22 января 2010 года
Rexulnik
217 / / 09.02.2005
Цитата: Proger_XP
Хуже, именно поэтому есть ее real-версия. real заменяет специальные символы, опираясь на кодировку соединения, а mysql_escape_string их пропустит. Кстати,



ааа... deprecated... ну всё равно ни одна ни другая ничего не дают никакого результата... всё равно чудеса на виражах(((

253
22 января 2010 года
Proger_XP
1.5K / / 07.08.2004
Разберись ты, что в какой кодировке у тебя передается.
1) если это UTF-8 - вызывай utf8_decode() перед любыми операциями над строкой. Когда все сделал, вызывай utf8_encode()
2) если это какая-то KOI8-R, Win-1251 и пр. - делай перекодировку iconv, см. хелп по пхп.
Никаких чудес тут не должно быть.
439
22 января 2010 года
Rexulnik
217 / / 09.02.2005
Цитата: Proger_XP
Разберись ты, что в какой кодировке у тебя передается.
1) если это UTF-8 - вызывай utf8_decode() перед любыми операциями над строкой. Когда все сделал, вызывай utf8_encode()
2) если это какая-то KOI8-R, Win-1251 и пр. - делай перекодировку iconv, см. хелп по пхп.
Никаких чудес тут не должно быть.



ну я ж говорю, шо кодировка файла UTF-8, в начале всех скриптов шлётся вот это header('Content-Type: text/html; charset=UTF-8'); кодировка страницы тоже UTF-8... данные передаются из input, правда на странице есть ещё TinyMCE, может он вывод каверкает как-то? ну хотя он на textarea подвешен а не на input...
вот это ставил перед выводом

 
Код:
iconv_set_encoding('internal_encoding', 'UTF-8');
iconv_set_encoding('output_encoding', 'UTF-8');

конвертил через iconv, utf8_decode и utf8_encode... он тупо не различает символы... хотя коды символов одинаковые... единственный вариант может попробовать по кодам символов сравнивать... но это изврат...
уже третий день долбаемся тут, и локально не работает и на серваке тоже... вот реально какие-то чудеса... много раз писал функции транслита... глюк PHP или Apache какой-то...
439
22 января 2010 года
Rexulnik
217 / / 09.02.2005
Цитата: Rexulnik
ну я ж говорю, шо кодировка файла UTF-8, в начале всех скриптов шлётся вот это header('Content-Type: text/html; charset=UTF-8'); кодировка страницы тоже UTF-8... данные передаются из input, правда на странице есть ещё TinyMCE, может он вывод каверкает как-то? ну хотя он на textarea подвешен а не на input...
вот это ставил перед выводом
 
Код:
iconv_set_encoding('internal_encoding', 'UTF-8');
iconv_set_encoding('output_encoding', 'UTF-8');

конвертил через iconv, utf8_decode и utf8_encode... он тупо не различает символы... хотя коды символов одинаковые... единственный вариант может попробовать по кодам символов сравнивать... но это изврат...
уже третий день долбаемся тут, и локально не работает и на серваке тоже... вот реально какие-то чудеса... много раз писал функции транслита... глюк PHP или Apache какой-то...



всем спасибо заработало))) только не знаю почему...

253
22 января 2010 года
Proger_XP
1.5K / / 07.08.2004
Запутался ты там... Если сейчас заработало, не факт, что не встретишь те же грабли, но с другой стороны - по себе говорю :)
439
25 января 2010 года
Rexulnik
217 / / 09.02.2005
та не, эт по моему PHP запутался, всё вроде щас пашет при помощи вот такой волшебной функции:
Код:
function encoderstring($string)
{
    $table = array(
                'А' => 'A',
                'Б' => 'B',
                'В' => 'V',
                'Г' => 'G',
                'Д' => 'D',
                'Е' => 'E',
                'Ё' => 'YO',
                'Ж' => 'ZH',
                'З' => 'Z',
                'И' => 'I',
                'Й' => 'J',
                'К' => 'K',
                'Л' => 'L',
                'М' => 'M',
                'Н' => 'N',
                'О' => 'O',
                'П' => 'P',
                'Р' => 'R',
                'С' => 'S',
                'Т' => 'T',
                'У' => 'U',
                'Ф' => 'F',
                'Х' => 'H',
                'Ц' => 'C',
                'Ч' => 'CH',
                'Ш' => 'SH',
                'Щ' => 'CSH',
                'Ь' => '',
                'Ы' => 'Y',
                'Ъ' => '',
                'Э' => 'E',
                'Ю' => 'YU',
                'Я' => 'YA',
                'а' => 'a',
                'б' => 'b',
                'в' => 'v',
                'г' => 'g',
                'д' => 'd',
                'е' => 'e',
                'ё' => 'yo',
                'ж' => 'zh',
                'з' => 'z',
                'и' => 'i',
                'й' => 'j',
                'к' => 'k',
                'л' => 'l',
                'м' => 'm',
                'н' => 'n',
                'о' => 'o',
                'п' => 'p',
                'р' => 'r',
                'с' => 's',
                'т' => 't',
                'у' => 'u',
                'ф' => 'f',
                'х' => 'h',
                'ц' => 'c',
                'ч' => 'ch',
                'ш' => 'sh',
                'щ' => 'csh',
                'ь' => '',
                'ы' => 'y',
                'ъ' => '',
                'э' => 'e',
                'ю' => 'yu',
                'я' => 'ya',
                //'`' => '',  
                '*' => '',
                '%' => '',
                '\\' => '-',
                '/' => '-',
                '~' => '',
                '^' => '',
                '?' => '',
                '&#33;' => '',
                'amp;' => 'and',
                '&#39;' => '',
                '#' => '',
                '&quot;' => '',
                '&' => '',
    );

    $output = str_replace(array_keys($table), array_values($table),$string);
    return $output;
}
253
25 января 2010 года
Proger_XP
1.5K / / 07.08.2004
strtr() делает то же самое, только без использования array_keys/values() Советую юзать её:
Цитата:

string strtr ( string $str , array $replace_pairs )



 
Код:
$rep_array = array( "123" => "456" );
$replaced = strtr($source, $rep_array);
439
25 января 2010 года
Rexulnik
217 / / 09.02.2005
Цитата: Proger_XP
strtr() делает то же самое, только без использования array_keys/values() Советую юзать её:


 
Код:
$rep_array = array( "123" => "456" );
$replaced = strtr($source, $rep_array);



ну со str_replace я ж пробовал, ничего не дало, видать это единственный способ(

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог