Avatar billede bomann Nybegynder
24. oktober 2006 - 19:52 Der er 9 kommentarer og
1 løsning

Encoding dataStream en umulig opgave (specialtegn)

Nedenstående source bruger HttpWebResponse og en streamreader til at læse html'en fra en webserver.

Streamreaderen kan creates med en parameter Encoding, der sikre at man får konverteret specialtegn til det ønskede format.

I response.CharacterSet får jeg den værdi, jeg i teorien skal bruge til encoding.

Hvis jeg requester bt.dk får jeg iso-8859-1 tilbage i response.CharacterSet hvilket stemmer fint overens med indholdet af head
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
og specialtegn som æøå ser ud som de skal

Hvis jeg requester dr.dk får jeg også iso-8859-1 tilbage i response.CharacterSet, men dette stemmer ikke over ens med indholdet af head
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
og specialtegn som æøå ser IKKE ud som de skal

Er der en måde hvor med man kan få det rigtige tegnsæt fra serveren så man altid er sikker på at specialtegn vises rigtigt??? Eller eventuel en anden måde hvor jeg kan opnå det samme!!?

Hjææææææælp :)


public string RequestHTML(string url) {

    // Create a request for the URL.
    WebRequest request = WebRequest.Create(url);
    // If required by the server, set the credentials.
    request.Credentials = CredentialCache.DefaultCredentials;
    // Get the response.
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

    // Get the stream containing content returned by the server.
    Stream dataStream = response.GetResponseStream();

    // Open the stream using a StreamReader for easy access.
    StreamReader reader = new StreamReader(dataStream, System.Text.Encoding.GetEncoding(response.CharacterSet));
    // Read the content.
    string responseFromServer = reader.ReadToEnd();

    // Cleanup the streams and the response.
    reader.Close();
    dataStream.Close();
    response.Close();

    return responseFromServer;

}
Avatar billede arne_v Ekspert
25. oktober 2006 - 01:07 #1
forslag (absolut ikke elegant, men ...):

1) læs det hele fra Stream ind i byte[]
2) wrap i en MemoryStream
3) wrap i en StreamReader med Encoding.Default
4) læs
5) hvis du finder et UTF-8 direktiv så hop til 2 og gør det samme bare med Encoding.UTF8
Avatar billede bomann Nybegynder
25. oktober 2006 - 10:26 #2
Ja, det er en løsning på problemet - har selv haft det i tankerne.
Jeg vil selvfølgelig helst uden om, at skulle pille CharSet ud med strengbehandling.
Det undrer mig, at det ikke kan lade sig gøre på den "rigtige" måde!?
Er det mon webserveren eller GetResponse der tager fejl af CharSet?
Jeg har søgt en del på google og det ser ud til, at der er mange der har samme problem, men ingen løsning...
Avatar billede arne_v Ekspert
25. oktober 2006 - 13:07 #3
ingen af delene - det er dem i den anden ende som lader HTTP serveren påstå
at det er ISO-8859-1 og så lader META tag fortælle at det er UTF-8
Avatar billede bomann Nybegynder
25. oktober 2006 - 13:15 #4
Men det er jo øjensynligt det der står i META tagget der er korrekt.
Vil man altid kunne aflæse charset i META tagget, eller er det også en opsætning man ikke nødvendigvis kan regne med? Nu er jeg ved at være ude påtynd is kan du nok høre ;)
Avatar billede arne_v Ekspert
25. oktober 2006 - 13:23 #5
META er forhåbentligt altid korrekt, men du kan ikke regne med at der altid er et META !
Avatar billede bomann Nybegynder
25. oktober 2006 - 13:35 #6
Så det tætteste man kommer på, er

Encoding.GetEncoding(response.CharacterSet)
Læs charset fra html
Findes charset i html og er denne <> response.CharacterSet så Encoding.GetEncoding(charset) ellers lev med den konvertering du får
Avatar billede bomann Nybegynder
25. oktober 2006 - 13:41 #7
Findes der ikke et råt "basis" format man kan læse streamen i, og så Encode alt til UTF-8 så det giver samme resultat uanset server opsætning mm?
Avatar billede arne_v Ekspert
26. oktober 2006 - 01:31 #8
nix

samme 2 byte kan være både legalt ISO-8859-1 og UTF-8
Avatar billede bomann Nybegynder
26. oktober 2006 - 08:46 #9
Okay, så må jeg jo bare møllen igennem 2 gange som du også har forslået.
Tak for viden - post et svar.
Avatar billede arne_v Ekspert
26. oktober 2006 - 13:28 #10
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester