За последние 24 часа нас посетили 17553 программиста и 1674 робота. Сейчас ищут 1992 программиста ...

Как узнать кодировку сайта делающего запрос к скрипту?

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

  1. allforweb

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

    С нами с:
    18 сен 2010
    Сообщения:
    72
    Симпатии:
    0
    Через GET запрос нужно отдать контент (простой текстовый тизер) другому сайту.
    Есть ли способ определить кодировку сайта, который делает запрос, чтобы отдать контент в нужной кодировке?
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    allforweb
    можно попросить, чтобы сайт сам указывал кодировку, иначе - в UTF-8 и будет красиво
     
  3. allforweb

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

    С нами с:
    18 сен 2010
    Сообщения:
    72
    Симпатии:
    0
    ну этот вариант очевиден, меня интересует именно автоматическая кодировка.
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    нет такого.
     
  5. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Вообще, способы именно программно определить кодировку - существуют, на Хабре, например, обсуждались. Конечно, о стопроцентной гарантии верного распознавания кодировки речи не идёт, но этот процент довольно высок. Есть алгоритм, дающий близкий к 100% результат.
    Но это не самый простой процесс, а стандартных функций, которые определяют кодировку (и делают это правильно), на сколько я знаю, не существует.
     
  6. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Можно требовать, что бы в запросе была заранее известная русская буква как отдельный параметр. Тогда легко восстановить кодировку. Но вообще-то, это забота запрашивающего сайта, зная в какой кодировке пришел ответ, перекодировать во внутреннюю... или ввести параметр в запросе, в какой кодировке хочет получить ответ запрашивающий сайт.
     
  7. Mamont

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

    С нами с:
    5 дек 2010
    Сообщения:
    183
    Симпатии:
    0
    allforweb
    Зачем тебе это делать, когда можно ответственность за получение данных в нужной кодировке возложить на клиента?
     
  8. allforweb

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

    С нами с:
    18 сен 2010
    Сообщения:
    72
    Симпатии:
    0
    Ну я могу запрашивать кодировку получателя и это очевидное решение, но есть же другой алгоритм. Многие рекламные сети (Google и Яндекс например) не запрашивают кодировку сайта и отдают коннтент в нужной кодировке. Значит они могут определить ее сами.
     
  9. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    sobachnik
    это GET запрос! =)

    allforweb
    Ну я могу запрашивать кодировку получателя и это очевидное решение, но есть же другой алгоритм.
    тысячи их. но стоит ли их придумывать? =) Тебе надо в отпуск.
     
  10. allforweb

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

    С нами с:
    18 сен 2010
    Сообщения:
    72
    Симпатии:
    0
    да это GET запрос
     
  11. Mamont

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

    С нами с:
    5 дек 2010
    Сообщения:
    183
    Симпатии:
    0
    http protocol Accept-Charset
     
  12. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    PHP:
    1. <?php
    2. $str = isset($_GET['text']) ? $_GET['text'] : '';
    3. echo mb_detect_encoding($str, "auto");
    4.  
    ну а дальше видимо iconv ...
     
  13. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    или вот так:

    PHP:
    1. <?php
    2.  
    3. header('Content-type: text/plain; charset: utf-8');
    4.  
    5. function is_utf8($data)  
    6. {  
    7.     $result = preg_replace('/.*/su', '', $data);  
    8.     return is_string($result) && strlen($result) == 0;  
    9. }  
    10.  
    11. $text = isset($_GET['text']) ? $_GET['text'] : '';
    12. $charset = is_utf8($text) ? 'UTF-8' : 'CP1251';
    13.  
    14. echo 'detected charset:' . $charset . "\n";
    15.  
    16. $text = iconv($charset, 'UTF-8//IGNORE', $text);
    17. echo $text;
    здесь делается допущение, что кодировка либо windows-1251 либо utf-8. я думаю это разумно :)
     
  14. Mamont

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

    С нами с:
    5 дек 2010
    Сообщения:
    183
    Симпатии:
    0
    artoodetoo, внимательно читал? ;)
     
  15. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    И таки что? Ты внимательно читал мой ответ?

    Если ты ищешь решение через жопу, то я пасс. Мой пример работает.
     
  16. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    artoodetoo
    он хочет через жопу.
     
  17. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Функция mb_detect_encoding() работает через жопу :)
    Если достаточно отличить utf8 от не utf8 - то второй пример - да, норм.
     
  18. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    в реале достаточно различать эти два случая. между latin1 и utf8 нет разницы а koi и dos остальись в вечной мерзлоте.

    не за что!
     
  19. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    artoodetoo
    Почему-то был уверен, что latin1 - это CP