Переход на утф8

Тема в разделе "PHP", создана пользователем sultan347, 26 ноя 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. sultan347

    sultan347

    Регистр.:
    25 апр 2009
    Сообщения:
    230
    Симпатии:
    7
    Адрес site.ru/%CF/%CF%F0%E8%E2%E5%F2 в urldecode означает site.ru/П/Привет.
    Сейчас сайт на утф8, и такие адресы вызывают ошибку, так "site.ru/П/Привет" выглядит уже по другому
    Как узнать, что обратились по старому адресу, и редриктит на нужную. spider.yandex.ru замучил, стучится по старому адресу
     
  2. antidote

    antidote

    Регистр.:
    21 янв 2008
    Сообщения:
    167
    Симпатии:
    42
    Ну можно так сделать. В htaccess добавить правило
    Код:
    RewriteRule ^([^0-9%a-z]+)$ redirect.php?encode=$1
    
    А в самом redirect.php прописать что-то типа
    PHP:
    header($_SERVER['SERVER_PROTOCOL']." 301 Moved Permanently");
    header ("Location: http://".$_SERVER['HTTP_HOST'].urlencode($_GET['encode']));
    exit();
    Тогда по идее не utf строки передаются в скрипт, который это все перекодирует и 301-м редиректом отправляет зашедшего на верный адрес
     
    sultan347 нравится это.
  3. sultan347

    sultan347

    Регистр.:
    25 апр 2009
    Сообщения:
    230
    Симпатии:
    7
    PHP:
        function detect_my_utf($s)//На выходе функции имеем 0 или 1, соответственно, не UNICODE или UNICODE. 
        
    {
            
    $s=urlencode($s); // в некоторых случаях - лишняя операция (закоментируйте)
            
    $res='0';
            
    $j=strlen($s);
            
    $s2=strtoupper($s);
            
    $s2=str_replace("%D0",'',$s2);
            
    $s2=str_replace("%D1",'',$s2);
            
    $k=strlen($s2);
            
    $m=1;
            if (
    $k>0)
                {
                    
    $m=$j/$k;
                    if ((
    $m>1.2)&&($m<2.2)){ $res='1';}
                }
            return 
    $res;
        }
    if (
    detect_my_utf($_GET['lr'])=='0')
            {
            
    header($_SERVER['SERVER_PROTOCOL']." 301 Moved Permanently");
            
    header("Location: http://site.ru/".urlencode(mb_convert_encoding($_GET['lr'],"UTF-8","CP1251"))."/");
            }
    Если $_GET['lr'] не юникод, то все ок, если $_GET['lr'] юникод то вот такая байда, функция detect_my_utf неправильно работает что ли
     
  4. antidote

    antidote

    Регистр.:
    21 янв 2008
    Сообщения:
    167
    Симпатии:
    42
    Ууууу, а если взять исходную строку, сделать копию, применить к копии iconv в utf-8 и потом сравнивать оригинал и копию на соответствие???

    или так http://www.php.su/functions/?mb-detect-encoding
     
  5. sultan347

    sultan347

    Регистр.:
    25 апр 2009
    Сообщения:
    230
    Симпатии:
    7
    PHP:
    function detect_my_utf($s)//0 или 1, соответственно, не UNICODE или UNICODE. 
        
    {
            
    $s=urlencode($s); // в некоторых случаях - лишняя
            
    $res='0';
            
    $j=strlen($s);
            
    $s=strtoupper($s);
            
    $s=str_replace("%D0",'',$s);
            
    $s=str_replace("%D1",'',$s);
            
    $k=strlen($s);
            if (
    $k>0)
                {
                    
    $m=$j/$k;
                    if ((
    $m>1.2)&&($m<2.2)){$res='1';}
                }
            return 
    $res;
        }
    if (
    strlen(urlencode($_GET['lr']))=='3')
            {
            
    $newurl='';
            if (isset(
    $_GET['katalog'])) {$newurl=$_GET['katalog']."/";}
            if (isset(
    $_GET['directorry']))  {$newurl.=$_GET['directorry']."/";}
            if (isset(
    $_GET['file']))  {$newurl.=$_GET['file'].".rar";}
            
    header($_SERVER['SERVER_PROTOCOL']." 301 Moved Permanently");
            
    header("Location: http://site.ru/".urlencode(mb_convert_encoding($_GET['lr'],"UTF-8","CP1251"))."/".$newurl);
            }
    if (isset(
    $_GET['katalog']))
        {
        if ((
    substr_count(urlencode(strtoupper($_GET['katalog'])),"%D0")=='0') AND (substr_count(urlencode(strtoupper($_GET['katalog'])),"%D1")=='0'))
            {
                if (
    detect_my_utf($_GET['katalog'])=='0')
                    {
                        
    $newurl='';
                        if (isset(
    $_GET['directorry']))  {$newurl.=$_GET['directorry']."/";}
                        if (isset(
    $_GET['file']))  {$newurl.=$_GET['file'].".rar";}
                        
    header($_SERVER['SERVER_PROTOCOL']." 301 Moved Permanently");
                        
    header("Location: http://site.ru/".urlencode($_GET['lr'])."/".urlencode(mb_convert_encoding($_GET['katalog'],"UTF-8","CP1251"))."/".$newurl);
                    }
            }
        }
    ......
    ......
    1. Как бороться с заглавной НЕ юникод русской буквой "Р" и "С"? Так как они в urlencode равны %D0 и %D1 соответственно. А проверка на утф основана на них.
    2. header("Location: Перейти по ссылке "); Не сразу редиректит что ли, хоть и в начале скрипта стоят, обработчик ошибок все равно фиксирует ошибочную обращение по старому адресу
     
Статус темы:
Закрыта.