Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Непонятные глюки с кодировкой и транслитом
 
 автор: Trivium   (21.01.2010 в 16:14)   письмо автору
 
 

Доброго времени суток!
Делаю вроде казалось бы тривиальную задачу - транслит строки для ссылок тэгов в блоге.
Но непонятный глюк возник: символы кириллицы куда-то теряются в кодировке... Коды символов абсолютно одинаковые при сравнении, но сами символы теряются и не сравниваются... Так происходит только с кириллицей, латинские буквы и знаки препинания нормально проходят, сами символы нормально проходят если их брать чисто из поста, а если их попробовать переконвертировать получается бред, и кстати разная длина строки, символов к примеру 30, а strlen показывает шо их 59... Но строка вроде как в UTF-8, Content-Type тоже UTF-8, в посте всё нормально, кодировка файлов скриптов тоже UTF-8, конвертил через iconv и уже всё перепробовал... Тривиальная задача такая, тысячу раз делал, но сейчас без понятия, что происходит...
Кто-то может знает в чём может быть прикол?

  Ответить  
 
 автор: Николай2357   (21.01.2010 в 23:39)   письмо автору
 
   для: Trivium   (21.01.2010 в 16:14)
 

Во первых считать нужно не strlen(), а mb_strlen(). Если это UTF-8 у Вас.
А во вторых не все функции будут корректно работать с кирилицей под UTF.
Код плиз на обозрение.

  Ответить  
 
 автор: Trivium   (22.01.2010 в 10:50)   письмо автору
 
   для: Николай2357   (21.01.2010 в 23:39)
 

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

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...

  Ответить  
 
 автор: buldovsky   (22.01.2010 в 11:18)   письмо автору
 
   для: Trivium   (22.01.2010 в 10:50)
 

> кстати в первом варианте всё проходит мимо switch, попадая сразу в default...

Включите вывод ошибок. Тут опечатка


<?php
 $kw_link 
.= Russian2lat($keywords[$i[);
?>

  Ответить  
 
 автор: Trivium   (22.01.2010 в 11:30)   письмо автору
 
   для: buldovsky   (22.01.2010 в 11:18)
 

ну это я случайно тут вставил, суть не в этом, а в том, что кодировка символов какая-то непонятная... бьются как-то все символы, конвертил уже через utf8_decode, utf8_encode и iconv, но всё равно кириллические символы бьются, а английские норм... и длина строки в mb_strlen и strlen больше чем символов реально почти в 2 раза... что может быть такое?

  Ответить  
 
 автор: buldovsky   (22.01.2010 в 11:45)   письмо автору
 
   для: Trivium   (22.01.2010 в 11:30)
 

Данные из базы? Там какая кодировка?

  Ответить  
 
 автор: Trivium   (22.01.2010 в 12:21)   письмо автору
 
   для: buldovsky   (22.01.2010 в 11:45)
 

нет, данные из поста идут

  Ответить  
 
 автор: Diplex   (22.01.2010 в 12:29)   письмо автору
 
   для: Trivium   (22.01.2010 в 12:21)
 

Покажите минимальный код-пример, который у Вас не работает. Желательно в аттаче в архиве в виде файлов.

  Ответить  
 
 автор: Trivium   (22.01.2010 в 12:57)   письмо автору
7.4 Кб
 
   для: Diplex   (22.01.2010 в 12:29)
 

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

  Ответить  
 
 автор: Diplex   (22.01.2010 в 13:04)   письмо автору
 
   для: Trivium   (22.01.2010 в 12:57)
 

Начните "собирать" страницу с самого начала. Добавляя элемент за элементом и проверяя.
Но сначала в самом верху напишите:
<?php
header
("Content-Type: text/html; charset=utf-8");
?>


Вот рабочий пример:
<?
header
("Content-Type: text/html; charset=utf-8");

function 
encodestring($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


$tr encodestring($_POST['keywords']);
echo 
"Транслит - ".$tr."<br>";
?>

<form action="" method="post">
<input type="text" name="keywords" size="77" value="<?php echo $_POST['keywords']; ?>"></td>
<input type="submit" value="Добавить">
</form>

  Ответить  
 
 автор: Trivium   (22.01.2010 в 13:38)   письмо автору
 
   для: Diplex   (22.01.2010 в 13:04)
 

о! большое спасибо!!! заработало!!! только без понятия почему... хэдеры я слал в самом начале выполнения в конфигурационном файле, и перепробовал всё уже... с меня виртуальным ящик водки)))

  Ответить  
 
 автор: Diplex   (22.01.2010 в 16:02)   письмо автору
 
   для: Trivium   (22.01.2010 в 13:38)
 

Я не пью :) Только соки и газировку :)

  Ответить  
 
 автор: Trivium   (22.01.2010 в 16:11)   письмо автору
 
   для: Diplex   (22.01.2010 в 16:02)
 

я тоже) ну тогда газировки с соком)))

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования