Nekonečný boj s nastavením Encoding stránky – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Nekonečný boj s nastavením Encoding stránky – .NET – Fórum – Programujte.comNekonečný boj s nastavením Encoding stránky – .NET – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Matěj Andrle+1
Grafoman
25. 12. 2014   #1
-
0
-

Dobrý den,
můj konzolový prohlížeč stále nedovede zobrazit jiné, než ASCII znaky. U ostatních mne čekají buď otazníky, či čaj. Přitom nastavuji výstup konzole na všechny možné kódové stránky. Když mi to po sté nešlo dynamicky, zkusil jsem projet ručně všechny. "Vyhled?v?n?" nepovažuji za valný výsledek... K čemu je vůbec v HtmlDocument (AgilityPack) tolik Encodingů, když je většina null a zkrátka žádný správný, to netuším... Už bych ale chtěl na stránce Google vidět "Vyhledávání"! :D Vskutku to není možné? (Výstupní encoding již byl i na všech Unicode.) Napadá mne jen nějak ještě řešit encoding samotného HTML... Html dostávám takto:

WebResponse resp = new URL().OpenURL(url);

using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
	newPage = parser.ParsePage(sr.ReadToEnd());


Může to být problém? (Potřebuji ukládat HTML, poněvadž bych jej jinak musel ustavičně stahovat a to nezní lákavě. Předávám si tedy string - ale asi to budu muset vyřešit vcelku v AgilityPack, nebo nevím.)
Děkuji.

Čeho je moc... :D

using (StreamReader sr = new StreamReader(resp.GetResponseStream(), true))
	newPage = parser.ParsePage(sr.ReadToEnd(), sr.CurrentEncoding);


Detekuje UTF8! A přesto to nejede... :D

Nahlásit jako SPAM
IP: 78.136.186.–
RomanZ
~ Anonymní uživatel
272 příspěvků
25. 12. 2014   #2
-
0
-

Zkus dat breakpoint za nacteni te stranky do stringu a pak se podivej na obsah te stringove promenne, jestli je ta cestina rozbita uz tam. Ja odhaduju, ze v promenne to budes mit jeste spravne a zkazi se to az pri vypisu do konzole. 

Nahlásit jako SPAM
IP: 79.127.137.–
Matěj Andrle+1
Grafoman
25. 12. 2014   #3
-
0
-

#2 RomanZ
Čaj v proměnné se mi podařil již několikrát. Mám jej tedy dosáhnout? Když mám čaj v proměnné a konzoli nastavenou na správný Encoding, tak to sice nezobrazuje otazníky, či čaj, leč ono to vynechá non-ASCII písmena úplně! (mezerovitost písmen šílená)

Nahlásit jako SPAM
IP: 78.136.186.–
Matěj Andrle+1
Grafoman
25. 12. 2014   #4
-
0
-

#2 RomanZ
Mám to dle tvého přání... :D Čaj:

"Vyhled�v�n�\r\nObr�zky\r\nMapy\r\nPlay\r\nYouTube\r\nZpr�vy\r\nGmail\r\nDisk\r\nDal��\r\nKalend�� <0>\r\nP�eklada� <1>\r\nN�kupy <2>\r\nBlogger <3>\r\nFotky <4>\r\nVidea <5>\r\nDocs <6>\r\nJe�t� dal�� » <7>\r\nAccount Options\r\nP�ihl�sit se\r\nNastaven� vyhled�v�n� <8>\r\nWebov� historie <9>\r\n×\r\nSurfujte po internetu rychleji\r\nNainstalovat Google Chrome <10>\r\n\r\nRoz���en� vyhled�v�n� <11>\r\nJazykov� n�stroje <12>\r\nInzerujte s Googlem <13>\r\n�e�en� pro firmy <14>\r\n+Google <15>\r\nV�e o Googlu <16>\r\nGoogle.com <17>\r\nOchrana soukrom� <18>\r\nSmluvn� podm�nky <19>\r\n"

A Console.OutputEncoding i Encoding detekovaný analýzou Streamu i skutečný Encoding stránky Google je UTF-8. Výsledkem je, že mi to nezobrazuje vyšší písmena - nad ASCII.

Připojen obrázek.


Co mám tedy dělat? :D

Nahlásit jako SPAM
IP: 78.136.186.–
p3can
~ Anonymní uživatel
312 příspěvků
25. 12. 2014   #5
-
0
-

#4 Matěj Andrle
zkusil bych google treba hned prvni odkaz...

            var req = WebRequest.CreateHttp(@"https://www.google.cz/?q=google+p%C5%99eklada%C4%8D");
            var resp = req.GetResponse() as HttpWebResponse;
            var en = Encoding.GetEncoding(resp.CharacterSet);
            using (StreamReader sr = new StreamReader(resp.GetResponseStream(),en))
            {
                var ss = sr.ReadToEnd();
                Console.WriteLine(ss);
            }
Nahlásit jako SPAM
IP: 62.209.223.–
Matěj Andrle+1
Grafoman
25. 12. 2014   #6
-
0
-

#5 p3can
Gratuluji - tou nejsložitější cestou jsi se dostal ke stejnému výsledku jako já. Ano - jedna stránka funguje - Google. A co takhle Itnetwork? :D

Připojen obrázek.

Musím se smát, poněvadž jinak by mi nezbylo jiného, než pláče. Je logické, že musím nastavovat i ecoding konzole, poněvadž stránky mají miliardu různých encodingů. Ovšem i když tak činím, Itnetwork a x dalších nejede. Google navíc jede jenom bez nastavování encodingu, který by měl být správný. (Console.OutputEncoding) Nějaké další nápady? Štve mě, že si někdo stále myslí, že zrovna já bych sem šel s něčím, čeho je plný Google. Tohoto plný Google vskutku není...

Nahlásit jako SPAM
IP: 78.136.186.–
Matěj Andrle+1
Grafoman
25. 12. 2014   #7
-
0
-

Ještě mě tak napadlo, leč přijde mi to jako blbost, že by mohlo hrát roli zbavení se entit: "HttpUtility.HtmlDecode"

Nahlásit jako SPAM
IP: 78.136.186.–
p3can
~ Anonymní uživatel
312 příspěvků
25. 12. 2014   #8
-
0
-

#6 Matěj Andrle
to bude asi problem v tom ze itnetwork je zbastleny a nema podporu pro "legaci" prohlizece a snazi se implementovat html5 ikdyz to neprojde pres html5 validaci.

reseni je nacist stranku v tom co dojde, zkusit v ni najit tag meta charset a zmenit cele encodovani podle tohoto tagu. pokud neni tag nalezen pouzit kod viz vyse.(tyka se jen "HTML5" stranek)

Nahlásit jako SPAM
IP: 62.209.223.–
Matěj Andrle+1
Grafoman
25. 12. 2014   #9
-
0
-

#8 p3can
Jenže to by měl řešit sám HtmlDocument (AgilityPack) - co jiného mám asi tak dělat? (Load -> Stream, či LoadHTML -> string...)

Nahlásit jako SPAM
IP: 78.136.186.–
Matěj Andrle+1
Grafoman
25. 12. 2014   #10
-
0
-

#8 p3can
A proč přestane fungovat Google -> UTF-8, když nastavím výstup konzole na tento encoding?

Nahlásit jako SPAM
IP: 78.136.186.–
Matěj Andrle+1
Grafoman
25. 12. 2014   #11
-
0
-

#8 p3can
Je to prosté. Když to nechám na HTML parseru, tak ten to vezme z tagu. Když to dám do streamu, ten to přeloží do Unicode z kódování, co je v hlavičce. Jenže jak to mám proboha zkombinovat. To by si jedině sám uživatel musel určit, které zobrazení je validní. Nenapadá mne totiž způsob, jak programově ověřit správnost zobrazení. A zrovna Google má v hlavičce jiný encoding, než v tagu. Ten v hlavičce je správný a v tagu špatný. Itnetwork má špatnou hlavičku, ale správný tag. Takže když použiji tvé řešení, jede Google, Youtube atp. Jenže cokoliv s nesedící hlavičkou - často HTML5 - zase nejede...

Nahlásit jako SPAM
IP: 78.136.186.–
p3can
~ Anonymní uživatel
312 příspěvků
25. 12. 2014   #12
-
0
-

#11 Matěj Andrle
Kde ma google jiny encoding v tagu ? me teda z google nechodi zadny meta charset tag v headu.

Nahlásit jako SPAM
IP: 62.209.223.–
Kit+15
Guru
26. 12. 2014   #13
-
0
-

#11 Matěj Andrle
Kódování a MIME v hlavičce HTTP "Content-Type:" má vždy přednost. Pokud to tvůj prohlížeč nerespektuje, máš problém.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Matěj Andrle+1
Grafoman
26. 12. 2014   #14
-
0
-

#13 Kit
Pak tedy nebudu schopen zobrazit žádné HTML5? A jakto, že FF je? Hele zkrátka když to nechám být - stáhnu jen HTML a hodím ho jako jediný parametr do HtmlDocument, tak jede každé HTML5 s UTF-8. Jenže jiného ne! A když tam dám CodePage z HttpWebResponse, tak jede jenom Google, Youtube,... Tak co mám dělat? A proč nefunguje nastavení Console.OutputEncoding?

Nahlásit jako SPAM
IP: 78.136.143.–
Matěj Andrle+1
Grafoman
26. 12. 2014   #15
-
0
-

Když se nedá na tyto atuomatické detekce spolehnout, musím tedy přistoupit k dvojtému stažení HTML no...

public StreamReader DetectEncoding(System.Net.WebResponse response)
{
	MemoryStream rawdata = new MemoryStream();
	byte[] buffer = new byte[1024];

	string

		charset = null,
		ctype = response.Headers["content-type"];

	if (ctype != null)
	{
		int ind = ctype.IndexOf("charset=");

		if (ind != -1)
			charset = ctype.Substring(ind + 8);
	}

	using (Stream rs = response.GetResponseStream())
	{
		int read = rs.Read(buffer, 0, buffer.Length);

		while (read > 0)
		{
			rawdata.Write(buffer, 0, read);
			read = rs.Read(buffer, 0, buffer.Length);
		}
	}

	if (charset == null)
	{
		int letter = 0;
		rawdata.Seek(0, SeekOrigin.Begin);
		string temp = new StreamReader(rawdata, Encoding.ASCII).ReadToEnd();

		Match match = Regex.Match(temp, @"\<meta[^\>]+charset=");
		letter = match.Index + match.Length + 1;

		while (match.Success && temp[letter] != '"')
			charset += temp[letter++];
	}

	Encoding encoding = null;
	try
	{
		encoding = Encoding.GetEncoding(charset);
	}
	catch
	{
		encoding = Encoding.ASCII;
	}

	rawdata.Seek(0, SeekOrigin.Begin);
	return new StreamReader(rawdata, encoding);
}
Nahlásit jako SPAM
IP: 78.136.143.–
Matěj Andrle+1
Grafoman
26. 12. 2014   #16
-
0
-

Ruším - nefunguje mi Azbuka! :D (Asi tedy i jiné cizokrajnosti.) Co mám dělat nyní?

Nahlásit jako SPAM
IP: 78.136.143.–
p3can
~ Anonymní uživatel
312 příspěvků
27. 12. 2014   #17
-
0
-

#16 Matěj Andrle
prejit na WF nebo WPF. proto to taky vymysleli.

Nahlásit jako SPAM
IP: 37.48.36.–
Matěj Andrle+1
Grafoman
28. 12. 2014   #18
-
0
-

#17 p3can
A proč vymysleli UNIX?

Nahlásit jako SPAM
IP: 78.136.143.–
Kit+15
Guru
28. 12. 2014   #19
-
0
-

#18 Matěj Andrle

A proč vymysleli UNIX?

Protože do té doby se každý počítač programoval jinak. UNIX sjednotil systémová volání programů a programy se tím staly přenositelné. To ušetřilo spoustu energie programátorům.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Matěj Andrle+1
Grafoman
28. 12. 2014   #20
-
0
-

#19 Kit
Vskutku - myslím že ale chápeš. Používám UNIX a líbí se mi používání terminálu - proč bych si asi dělal vlastní prohlížeč. Mé představy téměř naplňuje Elinks - ten však nelze upravit jak potřebuji... (Chci spojit Mplayer s JS a prohlížečem - dokonce jsem i přišel na to, jak přehrát SWF...)

EDIT: Totiž mít normální prohlížeč - obrázky, videa,...

Nahlásit jako SPAM
IP: 78.136.143.–
Kit+15
Guru
28. 12. 2014   #21
-
0
-

#20 Matěj Andrle
A co třeba Lynx nebo Links?

Napsal jsem si vlastní prohlížeč v Pythonu. Zkus to taky.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Matěj Andrle+1
Grafoman
28. 12. 2014   #22
-
0
-

#21 Kit
Ukaž mi JS, obrázky i videa v Lynxu a kolem projdou 2 stejné černé kočky! (když to je děda Elinks) :D Mplayer umí přehrát online video, s pomocí pár utilitek i SWF (chráněný proud) a obrázky samozřejmě také, rozšiřující knihovny pro JS již existují atd.

Nahlásit jako SPAM
IP: 78.136.143.–
Kit+15
Guru
28. 12. 2014   #23
-
0
-

#22 Matěj Andrle
Myslel jsem si, že zkoušíš napsat konzolový prohlížeč.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Matěj Andrle+1
Grafoman
28. 12. 2014   #24
-
0
-

#23 Kit
Kdy jsem napsal něco jiného???

Nahlásit jako SPAM
IP: 78.136.143.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 14 hostů

Podobná vlákna

Character encoding — založil Flowy

Transfer-encoding error — založil dalaman

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý