Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Extensions > Заговор mbstring


Автор: Vaulter 6.5.2007, 13:28
задача была проста
на входе имеем всякий мусор из $_GET $_POST или еще откуда (не суть)
на выводе: просто покласть в БД (это уже [censored 6]!!! smile)

читаю я и грызу стало быть про mbstring (о как хорошо, что она есть да этом долбанном сервере думал я!!! smile)

пишу
php.ini
Цитата

mbstring.detect_order = KOI8-R, CP866, cp1251, UTF-8, UTF-7, UTF-16, ASCII, JIS, EUC-JP, SJIS

проверяю:
Цитата

C:\Documents and Settings\Andrey.VAULTER>php -i | grep mbstring
mbstring
mbstring extension makes use of "streamable kanji code filter and converter", which is distributed under the GNU Lesser
General Public License version 2.1.
mbstring.detect_order => KOI8-R, CP866, cp1251, UTF-8, UTF-7, UTF-16, ASCII, JIS, EUC-JP, SJIS => KOI8-R, CP866, cp1251,
 UTF-8, UTF-7, UTF-16, ASCII, JIS, EUC-JP, SJIS
mbstring.encoding_translation => Off => Off
mbstring.func_overload => 0 => 0
mbstring.http_input => pass => pass
mbstring.http_output => pass => pass
mbstring.internal_encoding => ISO-8859-1 => no value
mbstring.language => neutral => neutral
mbstring.strict_detection => Off => Off
mbstring.substitute_character => no value => no value



но!!!
допустим на входе обычный запрос от яндекса 
вот такой код
Код

$referer = & $_SERVER['HTTP_REFERER'];
            $known = '.looksmart.co | .ifind.freeserve | .ask.co | google.co | '.
            'altavista.co | msn.co | yahoo.co |  yandex.ru | rambler.ru';
            if(preg_match('/('.$known.')/isx', $referer))
            {
                $blnSearchReferral=true;
                //get site domain — split at the first forward-slash
                $arr = parse_url($referer);
                // now find search parameters
                parse_str($arr['query'],$arrParams);
                //sys_log($arrParams);
                //define what search terms are in use by the different engines
                $arrQueryStrings = array();
                $arrQueryStrings[]='q';  //google, altavista, msn
                $arrQueryStrings[]='p';  //yahoo
                $arrQueryStrings[]='ask';  //ask jeeves
                $arrQueryStrings[]='key';  //looksmart
                $arrQueryStrings[]='text';  //yandex
                $arrQueryStrings[]='words';  //rambler
                $strSearchTerms = array_intersect(array_keys($arrParams), $arrQueryStrings);
                if(count($strSearchTerms))
                {//YO!
                    $request = urldecode($arrParams[array_pop($strSearchTerms)]);//some time UTF
                    sys_log('1.'.$request,'steps');
                    //mb_http_input == CONVERTCP?
                    if(function_exists('mb_convert_encoding'))//mb_encoding? FUCK
                    {
                        $enc = strtolower( mb_detect_encoding($request) );
                        //$enc2 = ;
                        sys_log('2.'.$enc,'steps');//.var_export(mb_detect_order(),true)
                        //sys_log(mb_http_input());
                        if( $enc && $enc!=CONVERTCP )
                        {
                            $request = mb_convert_encoding($request,CONVERTCP,$enc);
                            sys_log('3.'.$request,'steps');
                            if(strtolower( mb_detect_encoding($request) ) !=CONVERTCP)
                                sys_log('mb_convert_encoding failed: '.$enc.'->'.CONVERTCP.PHP_EOL.'request:'.$request.PHP_EOL.
                                'referer:'.urldecode($referer),'search');
                        }
                    }
                    //elseif(function_exists('iconv'))
                    //    $request = iconv('UTF-8','windows-1251',$request);
                    //else                    
                    //    $request = utf8_decode($request);//no variants
                    //sys_log($request);
                }
            }

в логах имею:
Цитата
steps:
#/*  -14:25:48 127.0.0.1 /------*/
1. проблемы банковской системы
#/*  -14:25:48 127.0.0.1 /------*/
2.euc-jp
#/*  -14:25:48 127.0.0.1 /------*/
3. ???? ????? ???
error:

#/*  -14:25:48 127.0.0.1 /------*/
mb_convert_encoding failed: euc-jp->cp1251
request: ???? ????? ???
referer:http://www.yandex.ru/yandsearch?text= проблемы банковской системы




 smile  smile  smile  smile 

Автор: Vaulter 6.5.2007, 18:40
изменил mb_detect_order (mbstring.detect_order) на
Цитата

cp1251, KOI8-R, CP866, UTF-8, UTF-7, UTF-16, ASCII

предыд. проблема исчезла, однако невзирая на все
при обработке UTF-8 строки вот такой код:
Код

                        $enc = strtolower( mb_detect_encoding($request) );
                        //$enc2 = ;
                        //sys_log('2.'.$enc,'steps');//.var_export(mb_detect_order(),true)
                        //sys_log(mb_http_input());
                        if( $enc && $enc!=CONVERTCP )
                        {
                            $request = mb_convert_encoding($request,CONVERTCP,$enc);
                            //sys_log('3.'.$request,'steps');
                            if(strtolower( mb_detect_encoding($request) ) !=CONVERTCP)
                                sys_log('mb_convert_encoding failed: '.$enc.'->'.CONVERTCP.'!='.strtolower( mb_detect_encoding($request) ).PHP_EOL.'request:'.$request.PHP_EOL.
                                'referer:'.urldecode($referer),'search');
                        }

постоянно пишет в логи:
[QUOTE]

#/* 05/06/07 19:23:46-19:23:46 91.143.129.214 /00025347.html------*/
mb_convert_encoding failed: utf-8->windows-1251!=
request:пути совершенствования учета основных средств
referer:http://ww

Автор: -=Ustas=- 8.5.2007, 09:09
Vaulter, а с чего это ты вдруг сюда ( всмысле в mb_.* ) прикручиваешь 8-ми битные кодировки?! Насколько я знаю, mb_* не работают с ними, поэтому для конверта юзай iconv.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)