За последние 24 часа нас посетили 17843 программиста и 1719 роботов. Сейчас ищут 873 программиста ...

Простой вопрос с кодировкой

Тема в разделе "Прочие вопросы по PHP", создана пользователем managerHR, 19 дек 2014.

  1. managerHR

    managerHR Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    4
    Симпатии:
    0
    Уважаемые проггеры, кодеры. Второй день не получается отладить код.

    В url получаем переменную - закодированную в Base 64, ее нужно раскодировать.
    После выполнения перекодировки из base 64 в utf-8 - (по косвенным признакам перекодирование проходит успешно) - длина переменной в которую записываем результат - изменяется до ожидаемого размера.
    Но при выполнении команды echo $Str - выводится первый символ из перекодированной строки и скрипт прекращает работать.
    Испробовал разные способы перекодировки из base 64 в utf-8/ascii - везде результат один, после перекодирования, при выводе командой echo перекодированной строки - скрипт выводит первую букву и отваливается.
    Вот код:
    Код (Text):
    1. <?
    2. header('Content-Type: text/html; charset=UTF-8');
    3. $host = $_SERVER['HTTP_HOST'];
    4. //setlocale(LC_TIME, "ru_RU.utf8");
    5. date_default_timezone_set('Europe/Moscow');
    6. $ip=$_SERVER['REMOTE_ADDR'];
    7.  
    8. $CryptedString = $_GET['MSBS'];
    9. echo "Poluchili stroku - ";
    10. echo $CryptedString;
    11. $B64petRepl = str_replace("dodge", "/", $CryptedString);
    12. //восстановили не передаваемый в url символ /
    13. $B64petReplv2 = str_replace("horse", "+", $B64petRepl);
    14. //восстановили не передаваемый в url символ +
    15. $B64petReplv2.= "=";
    16. //добавили в конец строки base64 знак = , при передаче в url он почему то отваливается
    17.  
    18.  
    19. echo "---Tip peremennoi base64 --";
    20. echo gettype($B64petReplv2), "\n";
    21.  
    22. echo "Opredelaem tip codirovki - ";
    23. echo mb_detect_encoding($B64petReplv2, "BASE64"), "\n";
    24. //у меня определяет как ascii, но с входяще строкой должно быть все в порядке - проверял через
    25. //онлайн перекодировщики из base64 - декодирует все верно
    26.  
    27. //Способ№1
    28. $String = mb_convert_encoding ($B64petReplv2 ,"ASCII" , "BASE64" );
    29. echo "---strlen---";
    30. echo strlen($String);
    31. echo " ---String --  ";
    32. echo $String; //здесь выводит первую букву и вываливается
    33.  
    34.  
    35. //Если выводить на экран этим способом - тоже  самое. Выводит первый символ и цикл прекращает работу.
    36. for($Y=0, $len=strlen($String); $Y<$len; $Y++){
    37.     echo $String{$Y};
    38. }
    39.  
    40. //Этот способ вообще не работает
    41. //$result = iconv("BASE64", "ASCII", $B64petReplv2);
    42. //echo $result;
    43.  
    44. // тоже самое - после вывода первого символа выключается
    45. //$Base64decoded = base64_decode($B64petReplv2);
    46. //echo "--Posle convertacii iz base 64 v ASCII - ";
    47. //echo $Base64decoded;
    Буду рад любым замечаниям и предложениям. Идти путем научного тыка, проб и ошибок - местами это неэффективно. Знаний и опыта в php не хватает.

    Вот передаваемое значение в кодировке base64 - YQByAF8AUABcAFQADABmAHgAfwBpAGEAFwB+AGIAXwBQAFwAVAAMAHwAWABSAEMAXgBCAF4AVwBFABEAZ
    gBYAF8AVQBeAEYAQgARAGkAYQARAGEAQwBeAFcAVABCAEIAWABeAF8AUABdABcAfgBiAF8ARABcAFMAVABDA
    AwAFwBhAHIAXgBGAF8AVABDAAwAFwB+AGIAUgBeAFUAVAAMABcAfgBiAGIAVABFAEQAQQB1AFAARQBUAAwA
    FwB+AGIARABBAEUAWABcAFQADAAXAGYAWABfAHUAWABDAAwAFwB+AGIAfQBQAF8AVgBEAFAAVgBUAAwAA
    QAFAAAA=

    После перекодировки из base64 должна получится другая строка без смысловой нагрузки: ar_P\T fxia~b_P\T |XRC .....
     
  2. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Так что не работает?

    Код (PHP):
    1. <?php
    2.  
    3. echo base64_decode('YQByAF8AUABcAFQADABmAHgAfwBpAGEAFwB+AGIAXwBQAFwAVAAMAHwAWABSAEMAXgBCAF4AVwBFABEAZ
    4. gBYAF8AVQBeAEYAQgARAGkAYQARAGEAQwBeAFcAVABCAEIAWABeAF8AUABdABcAfgBiAF8ARABcAFMAVABDA
    5. AwAFwBhAHIAXgBGAF8AVABDAAwAFwB+AGIAUgBeAFUAVAAMABcAfgBiAGIAVABFAEQAQQB1AFAARQBUAAwA
    6. FwB+AGIARABBAEUAWABcAFQADAAXAGYAWABfAHUAWABDAAwAFwB+AGIAfQBQAF8AVgBEAFAAVgBUAAwAA
    7. QAFAAAA=');
    8.  
    9. ?>
    результат: ar_P\T fxia~b_P\T |XRC^B^WEfX_U^FBiaaC^WTBBX^_P]~b_D\STC ar^F_TC ~bR^UT ~bbTEDAuPET ~bDAEX\T fX_uXC ~b}P_VDPVT 
     
  3. managerHR

    managerHR Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    4
    Симпатии:
    0
    Для меня это удивительно, действительно работает. Внесу некоторые уточнения:

    Пример работает, если обращаться к скрипту из браузера.

    Забыл написать в исходных данных - речь идет о клиент-серверном приложении. Скрипт VBS - отправляет на сервер HTTP запрос в кодировке base 64, на сервере php скрипт выполняет перекодировку строки из base 64 в ASCII или UTF-8 и отправляет ответ клиентской части на VBS, так вот ошибка возникает именно в этом случае.
    Может VBS скрипт глючит? Ответ сервера вывожу через MsgBox.

    Добавлено спустя 4 минуты 3 секунды:
    Или может не хватает какой то служебной информации для php при отправке HTTP Get запроса из VBS?
    Попробую результат запроса от VBS не отправлять обратно VBS, а записать в MySQL и посмотреть что там.

    Добавлено спустя 29 минут 34 секунды:
    Значит так, вбил жестко, вместо вычисляемой переменной - приведенную выше base 64 строку. В браузере выдает все как должно быть, а в VBS клиенте выдает только первую букву, после чего скрипт падает. Думаю дело в какой то служебной информации, которую не отправляет VBS ->PHP.
     
  4. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Читай документацию по функциям что используешь, возможно там будет разгадка
     
  5. managerHR

    managerHR Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    4
    Симпатии:
    0
    Denis, благодарю за помощь.
    Результаты отладки:

    Тестировалась работа связки VBS клиент <-> PHP сервер. После выполнения HTTP запроса из клиента VBS данные успешно декодируются на сервере PHP функцией mb_convert_encoding или base64_decode. Проверялось - через запись в MySQL результата декодирования и последующего просмотра БД.
    Затем в PHP командой echo выводим ту же переменную, которую писали в MySQL - вывод должен весь уходить в VBS клиент, - результат:
    В клиент VBS вместо всей строки приходит только первая буква и на этом выдача в скрипт VBS прекращается.

    В тоже время скрипт php продолжает работать и подтверждает нам это записывая следующей командой в MySQL флаг подтверждения своей работы.

    Вывод: отладка клиент - серверного приложения дело непростое. Претензии к PHP функциям снимаются.
    Ошибка локализована - неполная передача строки в VBS, в чем причина?

    VBS-клиент, отправляю HTTP Get запрос через MSXML2.XMLHTTP .Send ответ получаю через него же .responseText

    Чем клиентское приложение VBS может отличаться от ,браузера?
     
  6. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  7. managerHR

    managerHR Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    4
    Симпатии:
    0
    Привожу лог Fiddlera -
    [​IMG]

    Итак, на компьютер клиента приходит вся строка! А VBS глючит - не отображает все.
    Можно считать задачу решенной, спасибо за внимание.


    P.S. возможно VBS не поддерживает кодировку UTF-8 в диалоговом окне MsgBox, или не поддерживает спец символы в ASCII.