Polskie znaki a przeszukiwanie źródła strony

0

Witam. Mam problem z przeszukiwaniem stringa w którym są polskie znaki. Tak więc, mam taką funkcję:

bool Planet::is_built(std::string ob)
{

	size_t found = _BODY.find("alt=\""+ob+"\"");

	if(found != std::string::npos)
		return true;

	return false;
}

gdzie _BODY to źrodło strony (kod HTML). Teraz jeżeli jako argument podam wyraz z polskim znakiem, np. "Stodoła" to mi zwróci fałsz (nie znajdzie go, mimo że jest taki tag alt="Stodoła"). Jeżeli natomiast podam jakiś inny wyraz, który też jest w źródle ale już nie ma polskiego znaku, np. "Chlew" to znajdzie mi go poprawnie. Nawet gdy wyświetlam ten wyraz w konsoli to mam krzak zamiast polskiej litery. Dlatego Google mi podpowiedziało że trzeba przekonwertować polskie znaki, robię to funkcją:

std::string PL(std::string & znak) {
    
    for(unsigned i = 0; i < znak.length(); i++) {
        switch(znak[ i ]) {
        case 'ą':
            znak[ i ] = static_cast < char >( 165 );
            break;
            
        case 'ć':
            znak[ i ] = static_cast < char >( 134 );
            break;
            
        case 'ę':
            znak[ i ] = static_cast < char >( 169 );
            break;
            
        case 'ł':
            znak[ i ] = static_cast < char >( 136 );
            break;
            
        case 'ń':
            znak[ i ] = static_cast < char >( 228 );
            break;
            
        //itd
    }
    return znak;
}

Teraz wyświetla znak poprawnie, wyraz jest poprawny, ale nadal funkcja nie znajduje mi go w źródle strony choć jest.

PS. Źródło pobieram cURLem

Pozdrawiam

0

Niestety to nie jest takie proste. Polskie strony HTML mogą być zakodowanie w co najmniej 3 stronach kodowych - CP1250, ISO 8859-2 i utf-8. Ty próbujesz porównywać zawartość strony z literałami znakowymi, które są w kodowaniu w którym została napisana Twoja aplikacja (z reguły jest to CP1250 pod windowsem). Dlatego takie porównywania na pałę jest bez sensu.

Najsensowniej będzie operować w unikodzie (utf-16). Informację o kodowaniu strony znajdziesz w nagłówku odpowiedzi HTTP.

0

http://www.joelonsoftware.com/articles/Unicode.html

All that stuff about "plain text = ascii = characters are 8 bits" is not only wrong, it's hopelessly wrong, and if you're still programming that way, you're not much better than a medical doctor who doesn't believe in germs. Please do not write another line of code until you finish reading this article.

0
0x666 napisał(a):

Niestety to nie jest takie proste. Polskie strony HTML mogą być zakodowanie w co najmniej 3 stronach kodowych - CP1250, ISO 8859-2 i utf-8. Ty próbujesz porównywać zawartość strony z literałami znakowymi, które są w kodowaniu w którym została napisana Twoja aplikacja (z reguły jest to CP1250 pod windowsem). Dlatego takie porównywania na pałę jest bez sensu.

Najsensowniej będzie operować w unikodzie (utf-16). Informację o kodowaniu strony znajdziesz w nagłówku odpowiedzi HTTP.

Kodowanie mam na stronie UTF-8. Więc muszę takie samo ustawić w moim programie? Z tego co szukałem w Google to nie takie proste, ale przecież musi się jakoś dać to prosto zrobić, masa programów z takich rzeczy korzysta

0

Zrób tak jak pisałem, czyli przekonwertuj zawartość strony do utf-16 i w tym kodowaniu przetwarzaj tekst. Pod windowsem do konwersji możesz użyć MultiByteToWideChar. Bardziej przenośnie, ale nie bez problemów, to użycie mbstowcs + setlocale [C] lub codecvt + locale [C++].

p.s. nie cytuj całych postów, bo nie ma takiej potrzeby.

1 użytkowników online, w tym zalogowanych: 0, gości: 1