За последние 24 часа нас посетили 17616 программистов и 1592 робота. Сейчас ищут 1519 программистов ...

Проблема при транслитерации. Возможно проблема с кодировкой.

Тема в разделе "PHP для новичков", создана пользователем BaSh, 10 апр 2011.

  1. BaSh

    BaSh Активный пользователь

    С нами с:
    26 фев 2008
    Сообщения:
    16
    Симпатии:
    0
    Добрый вечер!
    Проблема в следующем.
    1) Вот скрипт, который транслирует на латиницу русский текст, указанный в скрипте:
    PHP:
    1. <?php ## Транслитерация строк.
    2. function transliterate($st) {
    3. //вывод до обработки
    4.   echo $st."<br>";
    5.   $st = strtr($st,
    6.     "абвгдежзийклмнопрстуфыэАБВГДЕЖЗИЙКЛМНОПРСТУФЫЭ",
    7.     "abvgdegziyklmnoprstufieABVGDEGZIYKLMNOPRSTUFIE"
    8.   );
    9.   $st = strtr($st, array(
    10.     'ё'=>"yo",    'х'=>"h",  'ц'=>"ts",  'ч'=>"ch", 'ш'=>"sh",  
    11.     'щ'=>"shch",  'ъ'=>'',   'ь'=>'',    'ю'=>"yu", 'я'=>"ya",
    12.     'Ё'=>"Yo",    'Х'=>"H",  'Ц'=>"Ts",  'Ч'=>"Ch", 'Ш'=>"Sh",
    13.     'Щ'=>"Shch",  'Ъ'=>'',   'Ь'=>'',    'Ю'=>"Yu", 'Я'=>"Ya",
    14.   ));
    15.   return $st;
    16. }
    17. //вывод после обработки
    18. echo transliterate("У попа была собака, он ее любил.");
    19. ?>
    При отладке с помощью PHPEd в $st попадает вот это - "РЈ РїРѕРїР° была собака, РѕРЅ ее любил."
    И при выводе получается вот:
    У попа была собака, он ее любил. - ВЫВОД $st ДО ОБРАБОТКИ
    Z� ZIZGZIZb ZgIFZAZb IMZGZgZbZiZb, ZGZD ZlZl ZAI�ZgZsZA. - ВЫВОД $st ПОСЛЕ ОБРАБОТКИ

    Установлено: PHP 5.3.5, Apache 2.2, PHPED 5.95.
    Сам скрипт написан в кодировке UTF8.

    Подскажите, дайте дельный совет, пожалуйста.
    ВОПРОС СОСТОИТ В СЛЕДУЮЩЕМ: почему в $st попадает такая белеберда (см. выше).
    Подскажите пожалуйста. Как можно решить эту проблему?
     
  2. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    посмотрите iconv. пригодится в любом случае. плюс там еще есть как опция транслитерация
     
  3. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    У меня такое работало. Попробуй. Самопальная, правда. Под свои нужды надо настроить.

    Код (Text):
    1. function translit($slovechko){
    2.     $replaceArr=array(
    3.     'А'=>'a','Б'=>'b','В'=>'v','Г'=>'g','Д'=>'d','Е'=>'e','Ё'=>'ie','Ж'=>'j','З'=>'z','И'=>'i','Й'=>'ii','К'=>'k','Л'=>'l','М'=>'m','Н'=>'n',
    4. 'О'=>'o','П'=>'p','Р'=>'r','С'=>'s','Т'=>'t','У'=>'u','Ф'=>'f','Х'=>'h','Ц'=>'c','Ч'=>'ch','Ш'=>'sh','Щ'=>'sh','Ъ'=>'','Ы'=>'y',
    5. 'Ь'=>'','Э'=>'e','Ю'=>'yu','Я'=>'ya',
    6.     'а'=>'a','б'=>'b','в'=>'v','г'=>'g','д'=>'d','е'=>'e','ё'=>'ie','ж'=>'j','з'=>'z','и'=>'i','й'=>'ii','к'=>'k','л'=>'l','м'=>'m','н'=>'n',
    7. 'о'=>'o','п'=>'p','р'=>'r','с'=>'s','т'=>'t','у'=>'u','ф'=>'f','х'=>'h','ц'=>'c','ч'=>'ch','ш'=>'sh','щ'=>'sh','ъ'=>'','ы'=>'y','ь'=>'',
    8. 'э'=>'e','ю'=>'yu','я'=>'ya',
    9.     ','=>'_',
    10.     '/'=>'_',
    11.     ':'=>'_',
    12.     '#'=>'_num_',
    13.     '№'=>'_num_',
    14.     ' '=>'_');
    15.     return strtr($slovechko,$replaceArr);
    16. }
     
  4. BaSh

    BaSh Активный пользователь

    С нами с:
    26 фев 2008
    Сообщения:
    16
    Симпатии:
    0
    У меня вопрос заключается в следующем:

    Почему в $st попадает такая фигня "РЈ РїРѕРїР° была собака, РѕРЅ ее любил."
    Там должен быть текст : У попа была собака, он ее любил.

    Насколько я понимаю - это проблема с кодировкой. Подскажите.
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    BaSh
    приведи в соответствие кодировку страницы (в заголовке) и в скрипте
     
  6. BaSh

    BaSh Активный пользователь

    С нами с:
    26 фев 2008
    Сообщения:
    16
    Симпатии:
    0
    Я правильно установил кодировку страницы в заголовке? Сам скрипт я преобразовал в utf-8 с помощью Notepad++.
    PHP:
    1. <?php ## Транслитерация строк.
    2. header("Content-Type: text/html; charset=utf-8");
    3. function transliterate($st) {
    Но это все равно не помогает(((
     
  7. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    у тебя были кодировки A(скрипт) и B(выдача). ты сделал B(скрипт) и С(выдача). ессно не помогло
     
  8. BaSh

    BaSh Активный пользователь

    С нами с:
    26 фев 2008
    Сообщения:
    16
    Симпатии:
    0
    Подскажи, пожалуйста, поподробнее. Что ты имеешь ввиду?
    Я скрипт писал в utf-8. В заголовке указал utf-8. И не получается.
    Если ты знаешь, объясни, пожалуйста.
     
  9. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    сделай перед вызовом функции echo $input; посмотрим, что на входе. если там уже кривое, то используй iconv для того чтобы конвертировать входной параметр из кодировки XXXX в кодировку utf-8. и только потом направляй строку в функцию.
     
  10. BaSh

    BaSh Активный пользователь

    С нами с:
    26 фев 2008
    Сообщения:
    16
    Симпатии:
    0
    Если я правильно понял тебя, то я сделал следующее:
    PHP:
    1. <?php ## Транслитерация строк.
    2. header("Content-Type: text/html; charset=utf-8");
    3. function transliterate($st) {
    4.   echo $st."<br>";
    5.   $st = strtr($st,
    6.     "абвгдежзийклмнопрстуфыэАБВГДЕЖЗИЙКЛМНОПРСТУФЫЭ",
    7.     "abvgdegziyklmnoprstufieABVGDEGZIYKLMNOPRSTUFIE"
    8.   );
    9.   $st = strtr($st, array(
    10.     'ё'=>"yo",    'х'=>"h",  'ц'=>"ts",  'ч'=>"ch", 'ш'=>"sh",  
    11.     'щ'=>"shch",  'ъ'=>'',   'ь'=>'',    'ю'=>"yu", 'я'=>"ya",
    12.     'Ё'=>"Yo",    'Х'=>"H",  'Ц'=>"Ts",  'Ч'=>"Ch", 'Ш'=>"Sh",
    13.     'Щ'=>"Shch",  'Ъ'=>'',   'Ь'=>'',    'Ю'=>"Yu", 'Я'=>"Ya",
    14.   ));
    15.   return $st;
    16. }
    17. $input = "У попа была собака, он ее любил";
    18. echo $input."<br>";
    19. echo transliterate("У попа была собака, он ее любил.");
    20. ?>
    При отладке через PHPEd в $input хранится следующее:"РЈ РїРѕРїР° была собака, РѕРЅ ее любил"

    Результат получается вот такой:
    У попа была собака, он ее любил
    У попа была собака, он ее любил.
    Z� ZIZGZIZb ZgIFZAZb IMZGZgZbZiZb, ZGZD ZlZl ZAI�ZgZsZA.


    Ты это имел ввиду?