Opravdu korektní získání obsahu HTML stránky z URL i se zdrojákem
Před vánoci jsem se
rozčiloval na nekvalitním napsáním WebRequest/WebResponse tříd. Problém, který jsem řešil včetně
řešení byl ten, že v okamžiku stahování HTML stránky neznáte její kódování. Ale k zdrojovému kódu stránky se dostanete pouze pomocí čtení streamu a k tomu potřebujete znát kódování stránky. Pokud použijete špatné (což je v případě neznámých HTML stránek realita), je obsah stránky nečitelný. Problém mého předchozího řešení byl, že se stránka musela ze serveru stáhnout 2x. Poprvé pro zjištění kódování (kódování se hledá jen v HTTP hlavičkách, tak v HTML kodu), podruhé pro získání obsahu ve správném kódování. Věděl jsem, jak z toho ven, ale neměl jsem čas to napsat. Až dnes.
Jak to dělám ?(pokud víte lepší, napište).
Celý stream přečtu po bytech do pole bytů.
Pokud HTTP hlavička neobsahuje informaci o kódování, pak hledám v HTML kodu v sekci <HEAD>.Pokud ani teď nic nenajdu, používám nadále ASCII kódování.
Pro získání obsahu už pak pouze byte pole přečtu pomocí odpovídajícího kódování a decoderu ( encoding.Decoder) do pole znaku Char() a to převedu do stringu v UTF-8.
Odbyde mi tím jeden HTTPRequest ze dvou, zase ale konvertuji pole sem a tam. To se mi ještě nelíbí, ale zatím nevím, jak z toho ven.
Testováno na evropských, východoevropských, unicode a ascii kódování. Netestoval jsem na východoasijských kódování (čína, japonsko, korea a spol), ani na stránkách psaných zprava doleva.
Třída je ke stáhnutí tady -
URLContent.zip.