Dobrý den,
snažím se dostat html kód z webových stránek do richtextboxu (v textboxu to
byla katastrofa ), ovšem
mnoho znaků zobrazených v tom richtextboxu ani náhodou neodpovídá
skutečnosti. Zřejmý problém - české znaky... Ovšem ať dělám, co dělám,
nedaří se mi dostat to správně. Zkusil jsem DataFormat - ale problém asi
bude při stažení, či netuším kde... Jeli problém v tom richtextboxu,
tak mi to nevadí - potřebuji to mít správně hlavně ve stringu - do
kterého stahuji - ovšem nevím, jak zjistit, kde je problém...
new WebClient().DownloadString(url)
Rovnou se zeptám - není rychlejší cesta - respektive - jaká je
nejrychlejší cesta dostat html z url? Děkuji...
Myslím, že rychlost bude vždy stejná, záleží na tom webu, ze kterého
to stahuješ. Pokud je kódování UTF8, naměl by to být problém. Pokud ne,
musí se převést. Zkus webklientovi nastavit Encoding na
System.Text.Encoding.UTF8.
JJ - jede to - děkuji. Mám ale menší zápletku - dělám html parser -
tedy encoding se dozvím až po stáhnutí html z url. Jak bych to tedy měl
řešit? Děkuji.
No protože toto není jediný způsob získání URL - tedy někdy znám
přesnou URL - tak dám rovnou GetHtml... Jak píši - do poslední chvíle vše
běží jak má - jakmile dojde na stáhnutí stringu, tak se to zasekne...
Zkoušel jsem i nastavit kódování pevně...
MessageBox? Používej BreakPointy, potom jen najedeš na proměnnou a
vidíš její obsah. Zkus tu funkci s pevnými URL po jednom, takhle se nikam
nedostaneš, když to budeš ladit jako celek.
Tak je to problém - v tom kódu nahoře pavně nastavuji encoding - i s
proměnnou pageEncoding to jede - ale zde se jak jsem psal zobazuje ISO-8859-1 a
české znaky nejdou... Jiné stránky jdou.
Pokud česká www stránka používá ISO-8859-1, je to chybně. Toto
kódování je určeno pro západní Evropu a neobsahuje písmena s háčky.
Pochopil bych ISO-8859-2, Windows-1250 nebo UTF-8. Jiná kódování nejsou
doporučována. Dnes bych použil už jen UTF-8. Nemám důvod používat něco
jiného, protože celé PC mi jede na UTF-8, takže nemusím nic
konvertovat.
No ale mě to hlásí toto... Jak píši, třeba youtube jede bez problému - s českými znaky.
Zatím jsem toho moc nezkoušel - ale vše šlapalo... Vím, jakou má devbook
znakovou sadu - proto se divím - a ptám se, co s tím...
No mě jde o to, aby na stránce nebyly nečitelné znaky - když dám utf-8
- půjde to všem?
Jo a z toho co bylo v popisu toho kódování - toho nahoře - jsem pochopil,
že to bere znaky zapsané v číselném tvaru - možná to je ten problém. Jak
tyto kódy zobrazit jako znaky? Tedy aby mi to dalo nejméně práce.
Děkuji.
Dělá se to. Dokonce bylo na jednom serveru nastaveno kódování na
Windows-1250 a bez této "finty" se mi text napsaný v UTF-8
rozhodil, i když jsem to v http-equiv měl správně.
Dále to úspěšně využívám, pokud potřebuji prezentovat prostý text,
třeba logy. Jiný způsob pro uvedení kódování prostého textu už není.
Ta hlavička pak samozřejmě vypadá trochu jinak.
Přemýšlel jsem, jak tu nudli s UrlExist() udělat ještě čistěji.
Napadlo mě z těch různých pokusů udělat seznam, ten projít
foreach, při úspěšném testu UrlExist() provést
GetHtml() a returnem opustit cyklus s návratem výsledku.
Pokud proběhne celý cyklus, hledání bylo neúspěšné. Tím odpadne
poslední podmíněný příkaz. Stačí pak už jen vyvolat výjimku, kterou si
vyšší vrstvy zachytí dle potřeby.
Coo? Jak bys tam chtěl použít foreach? Přece to nebudu dělat přes list.
Toto mi přijde jako dobré řešení. Proč by byl zbytečný? Ať udělám co
udělám, kratší to už nebude - maximálně v řádu zanedbatelném...
Však testing v principu není pole, ale seznam. Proto by se s
ním mělo zacházet jako se seznamem. Řídící proměnnou Sindex
přece k ničemu nepotřebuješ. Nebo snad ano?
Teď už nejde o to, aby to bylo ještě kratší, ale aby to bylo správně.
Aby se používaly správné datové struktury pro správné účely. Psal jsem,
že hledám čisté řešení.
Pokud vracíš true nebo false, tak throw nepotřebuješ.
Naučil jsem se používat výjimky vždy, když dojde k nějaké
nestandardní situaci. Můj původní záměr totiž byl volat funkci
SetUrl() takto:
try {
var index = tabControl1.SelectedIndex;
textboxes[index].Text=SetUrl(adjustmentUrl);
// další příkazy
}catch (Exception ex){
MessageBox.Show(ex);
}
Tímto způsobem se vyhneš použití globální proměnné
textboxes uvnitř funkce.
BTW: Kvůli experimentům jsem si před chvílí nainstaloval
Mono, abych si mohl předem vyzkoušet, než sem něco pošlu. Ten
inline seznam jsem totiž v této podobě nikde nenašel. Teprve po několika
pokusech jsem přišel na to, jak to má správně vypadat.
Když použiješ výjimku, nemusíš testovat zkaženou URL.
Podle mne jsou výjimky mnohem lepší, než vracet boolean. Nemusíš prznit
návratovou hodnotu funkce, používat globální proměnné a většinou ani
předávat parametry odkazem. Errorflow teče jinudy.
Samozřejmě - však se to snažím vychytat - nebylo to myšleno jinak, než
napsáno...
No zde by to vypadalo úplně stejně - jen bych vyvolal vyjímku - a musel
ji chytat v try bloku - to mi nepřijde pěkné. Takto mám přehlednou
podmínku. Jako proč by mělo být výhodnější vyvolávat vyjímku, oproti
testování v podmínce?
Ale hlavně: Zavoláš funkci a její výsledek někam uložíš. Pokud dojde
k výjimce, uložení se neprovede. V hlavním bloku nemusíš nic testovat,
pouze provedeš přiřazení. A takových přiřazení můžeš udělat klidně
10 za sebou bez jakéhokoli testování. Pokud v některém z nich dojde k
výjimce, blok je opuštěn a pokračuje větví catch.
Výsledkem funkce není status, zda se povedla, ale hodnota, kterou někde
použiješ.
Aha - špatně si mne pochopil - netestuji URL zvlášť - to testu zahrnuji
v případě návratu true přidání správné URL do seznamu navšťívených
URL... (Mimo jiné do seznamu doplňující právě psanou URL.)
Ano to jsem pochopil, ale nechápu, proč je lepší try blok:
Protože ses ještě nenaučil výjimky používat. A také ses ještě
nenaučil používat funkce. Uvedený příklad try..catch nemá smysl
opravovat, protože je celý chybně. Používání globálních proměnných je
nešvar, je to tzv. side-effect, který by funkce neměla mít.
Sám píšeš "přidání správné URL do seznamu navšťívených URL".
Použil jsi slovíčko "seznam". Proč s tím tedy nezacházíš jako se
seznamem, ale jako kdyby to bylo pole? Položky v seznamu index nemají,
používá se iterátor.
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.