[Delphi] UTF8 > 1251, квадратики

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Jakeroid, 6 Jan 2011.

  1. Jakeroid

    Jakeroid Member

    Joined:
    9 May 2009
    Messages:
    198
    Likes Received:
    12
    Reputations:
    1
    Есть функция, она скачивает страницу в UTF8. Качает с помощью 10-ого индейца.
    В ней же я использую UTF8Decode, и возвращаю строку.
    Вывожу в Мемо.
    Там где в html были переносы строк, появились квадратики.
    В чем причина?

    P.S. Весь остальной текст отображается корректно!
     
  2. heJiZzZ

    heJiZzZ Member

    Joined:
    1 Jun 2009
    Messages:
    40
    Likes Received:
    18
    Reputations:
    10
    выложи ф-цию. поглядим
     
  3. POS_troi

    POS_troi Elder - Старейшина

    Joined:
    1 Dec 2006
    Messages:
    1,569
    Likes Received:
    466
    Reputations:
    108
    Разные коды перевода строки.
    Есть такой вариант функции

    Code:
    wchar_t Utf8( std::istream &in, void * data )
        {
            char c = in.get();
            if( !in ) 
                return 0;
            // 0xxxxxxx
            if( 0 == ( c & '\x80' ) ) 
                return wchar_t( c );
            // 1111 - error, more than 16-bit char
            else if( '\xF0' == ( c & '\xF0' ) )
                throw Error( BAD_ENCODING ); 
            // 1110xxxx 10xxxxxx 10xxxxxx
            else if( '\xE0' == ( c & '\xF0' ) )
            {
                char c2 = in.get();
                char c3 = in.get();
                if( !in )
                    throw Error( BAD_ENCODING );
                return ( wchar_t( c & '\x0F' ) << 12 ) | ( wchar_t( c2 & '\x3F' ) << 6 ) | ( c3 & '\x3F' );
            }
            // 110xxxxx 10xxxxxx 
            else if( '\xC0' == ( c & '\xE0' ) )
            {
                char c2 = in.get();
                if( !in )
                    throw Error( BAD_ENCODING );
                return ( wchar_t( c & '\x1F' ) << 6 ) | ( c2 & '\x3F' );
            }
            else 
                throw Error( BAD_ENCODING );
        }
    

    Или так.
    Code:
    function utf8_to_cp1251($utf8) {
    
        $windows1251 = "";
        $chars = preg_split("//",$utf8);
    
        for ($i=1; $i<count($chars)-1; $i++) {
            $prefix = ord($chars[$i]);
            $suffix = ord($chars[$i+1]);
    
            if ($prefix==215) {
                $windows1251 .= chr($suffix+80);
                $i++;
            } elseif ($prefix==214) {
                $windows1251 .= chr($suffix+16);
                $i++;
            } else {
                $windows1251 .= $chars[$i];
            }
        }
    
        return $windows1251;
    }
    
    function Utf8Win($str,$type="w")  {
        static $conv='';
    
        if (!is_array($conv))  {
            $conv = array();
    
            for($x=128;$x<=143;$x++)  {
                $conv['u'][]=chr(209).chr($x);
                $conv['w'][]=chr($x+112);
    
            }
    
            for($x=144;$x<=191;$x++)  {
                $conv['u'][]=chr(208).chr($x);
                $conv['w'][]=chr($x+48);
            }
    
            $conv['u'][]=chr(208).chr(129);
            $conv['w'][]=chr(168);
            $conv['u'][]=chr(209).chr(145);
            $conv['w'][]=chr(184);
            $conv['u'][]=chr(208).chr(135);
            $conv['w'][]=chr(175);
            $conv['u'][]=chr(209).chr(151);
            $conv['w'][]=chr(191);
            $conv['u'][]=chr(208).chr(134);
            $conv['w'][]=chr(178);
            $conv['u'][]=chr(209).chr(150);
            $conv['w'][]=chr(179);
            $conv['u'][]=chr(210).chr(144);
            $conv['w'][]=chr(165);
            $conv['u'][]=chr(210).chr(145);
            $conv['w'][]=chr(180);
            $conv['u'][]=chr(208).chr(132);
            $conv['w'][]=chr(170);
            $conv['u'][]=chr(209).chr(148);
            $conv['w'][]=chr(186);
            $conv['u'][]=chr(226).chr(132).chr(150);
            $conv['w'][]=chr(185);
        }
    
        if ($type == 'w') {
            return str_replace($conv['u'],$conv['w'],$str);
        } elseif ($type == 'u') {
            return str_replace($conv['w'], $conv['u'],$str);
        } else {
            return $str;
        }
    }
    Не заметил что под делфи нужно но мож переделаеш )
     
  4. napas_hd

    napas_hd Member

    Joined:
    29 Dec 2008
    Messages:
    61
    Likes Received:
    17
    Reputations:
    0
    Сдаётся мне, что memo не обрабатывает нормально перенос строки.
     
  5. Jakeroid

    Jakeroid Member

    Joined:
    9 May 2009
    Messages:
    198
    Likes Received:
    12
    Reputations:
    1
    РЕШЕНО!
    "Квадратики" были только там, где после переноса строки стоял еще и <br>. Заменил все <br>, исчезли квадратики :).