|
|
|
| Доброго времени суток!
Делаю вроде казалось бы тривиальную задачу - транслит строки для ссылок тэгов в блоге.
Но непонятный глюк возник: символы кириллицы куда-то теряются в кодировке... Коды символов абсолютно одинаковые при сравнении, но сами символы теряются и не сравниваются... Так происходит только с кириллицей, латинские буквы и знаки препинания нормально проходят, сами символы нормально проходят если их брать чисто из поста, а если их попробовать переконвертировать получается бред, и кстати разная длина строки, символов к примеру 30, а strlen показывает шо их 59... Но строка вроде как в UTF-8, Content-Type тоже UTF-8, в посте всё нормально, кодировка файлов скриптов тоже UTF-8, конвертил через iconv и уже всё перепробовал... Тривиальная задача такая, тысячу раз делал, но сейчас без понятия, что происходит...
Кто-то может знает в чём может быть прикол? | |
|
|
|
|
|
|
|
для: Trivium
(21.01.2010 в 16:14)
| | Во первых считать нужно не strlen(), а mb_strlen(). Если это UTF-8 у Вас.
А во вторых не все функции будут корректно работать с кирилицей под UTF.
Код плиз на обозрение. | |
|
|
|
|
|
|
|
для: Николай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... | |
|
|
|
|
|
|
|
для: Trivium
(22.01.2010 в 10:50)
| | > кстати в первом варианте всё проходит мимо switch, попадая сразу в default...
Включите вывод ошибок. Тут опечатка
<?php
$kw_link .= Russian2lat($keywords[$i[);
?>
|
| |
|
|
|
|
|
|
|
для: buldovsky
(22.01.2010 в 11:18)
| | ну это я случайно тут вставил, суть не в этом, а в том, что кодировка символов какая-то непонятная... бьются как-то все символы, конвертил уже через utf8_decode, utf8_encode и iconv, но всё равно кириллические символы бьются, а английские норм... и длина строки в mb_strlen и strlen больше чем символов реально почти в 2 раза... что может быть такое? | |
|
|
|
|
|
|
|
для: Trivium
(22.01.2010 в 11:30)
| | Данные из базы? Там какая кодировка? | |
|
|
|
|
|
|
|
для: buldovsky
(22.01.2010 в 11:45)
| | нет, данные из поста идут | |
|
|
|
|
|
|
|
для: Trivium
(22.01.2010 в 12:21)
| | Покажите минимальный код-пример, который у Вас не работает. Желательно в аттаче в архиве в виде файлов. | |
|
|
|
|
 7.4 Кб |
|
|
для: Diplex
(22.01.2010 в 12:29)
| | не работает транслит, ни одна функция не может переконвертировать строку из кириллицы и не может символы обнаружить и нормально заменить. кодировка UTF-8, но не работает((( | |
|
|
|
|
|
|
|
для: 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',
' ' => '_',
//'`' => '',
'*' => '',
'%' => '',
'\\' => '-',
'/' => '-',
'~' => '',
'^' => '',
'?' => '',
'!' => '',
'amp;' => 'and',
''' => '',
'#' => '',
'"' => '',
'&' => '',
);
$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>
|
| |
|
|
|
|
|
|
|
для: Diplex
(22.01.2010 в 13:04)
| | о! большое спасибо!!! заработало!!! только без понятия почему... хэдеры я слал в самом начале выполнения в конфигурационном файле, и перепробовал всё уже... с меня виртуальным ящик водки))) | |
|
|
|
|
|
|
|
для: Trivium
(22.01.2010 в 13:38)
| | Я не пью :) Только соки и газировку :) | |
|
|
|
|
|
|
|
для: Diplex
(22.01.2010 в 16:02)
| | я тоже) ну тогда газировки с соком))) | |
|
|
|
|