WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   StreamReader konverterar å-ä-ö (https://www.wn.se/forum/showthread.php?t=35087)

peterbf 2009-02-12 10:26

Tjenare!

Har ett jQuery.ajax-GET-anrop som jag skickar till en Generic Handler bestående av bl.a. följande kod:
Kod:

string formattedUri = String.Format(WebServiceURL, card.CardName, preferedLanguage);

HttpWebRequest webRequest = GetWebRequest(formattedUri);

HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();

string jsonResponse = string.Empty;

using (StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) {
jsonResponse = sr.ReadToEnd();
}

Skickar in ett ID som jag sedan använder för att hämta namnet på vederbörande, i detta fall "Göran Persson".

Under min debugging-tour i denna kod så skrivs Göran Persson ut som det ska tills sr.ReadToEnd() körs. Jag har Encoding.UTF8, databastabellen och därmed fältet är UTF-enkodat. I jQuery.Ajax-anropet har jag definierat:

contentType: "application/json; charset=utf-8"

och i min Generic Handler har jag högst upp:

context.Response.ContentEncoding = Encoding.UTF8;

Vad kan jag mer testa?

Detta måste på nåt sätt ske innuti min StreamReader då det är den som anropar response.GetResponseStream() och hämtar datan från Wikipedia. Just nu replace:ar jag efter StreamReaders using-block, vilket inte har nån betydelse egentligen förutom att det skrivs ut med rätt bokstäver nu, men den hämtar inte korrekt wikipediaartikel då hämtningen av data sker inne i StreamReadern.
Just nu returnerar den Göran Persson som: G\u00c3\u00b6ran Persson\n och när detta skickas tillbaka till min aspx-sida skrivs det ut som: Göran Persson. Jag kan ersätta "\u00c3" till "ö" och "\u00b6" till "ä", men grejen är att jag ska returnera data, och den hämtar datan i StreamReadern.

Har även kollat upp att avändaren skickar UTF8, så då ska jag även ta emot som UTF8 som jag redan gör.

Vad ska jag göra?

Jonas 2009-02-12 13:31

Är filen sparad dom UTF8 ?

peterbf 2009-02-12 14:23

Jag gör ett anrop till www.dapper.net för att hämta data från www.wikipedia.org, båda dessa sidor har UTF8 som Content Type.

Kan inte förstå detta.

Westman 2009-02-12 15:21

Jag har haft exakt samma bekymmer och min fullösning var att använda htmlencode för att få åäö att lira ordentligt.

peterbf 2009-02-12 15:58

Hur då menar du? Exakt var bör jag HtmlEncode:a?

Jonas 2009-02-13 16:36

Är filen sparad som UTF8? Alltså, när du väljer "Spara som", så kan man välja att filen skall sparas som UTF8.

Bara för att Content-Type är utf8 betyder det inte att filen är utf8, det har en tendens att ge många skumma problem.

tartareandesire 2009-02-13 16:43

Citat:

Originally posted by Jonas@Feb 13 2009, 17:36
Är filen sparad som UTF8? Alltså, när du väljer Spara som, så kan man välja att filen skall sparas som UTF8.
Bara för att Content-Type är utf8 betyder det inte att filen är utf8, det har en tendens att ge många skumma problem.

Det beror ju lite på vilket program man använder. Det går ofta att välja teckenkodning redan innan man sparar.

Westman 2009-02-13 19:29

Citat:

Originally posted by peterbf@Feb 12 2009, 16:58
Hur då menar du? Exakt var bör jag HtmlEncode:a?
Utifrån det lilla jag ser så skulle jag prova att köra htmlencode på jsonResponse

peterbf 2009-02-14 16:38

Nej, går inte.

Som sagt, allt sker innuti StreamReader:n, så det är la där jag måste göra nåt?

digiArt 2009-02-14 18:08

Hämta teckenkodningen från HttpWebResponse

Kod:

Encoding.GetEncoding(response.CharacterSet);

Westman 2009-02-14 18:31

Citat:

Originally posted by peterbf@Feb 14 2009, 17:38
Nej, går inte.

Som sagt, allt sker innuti StreamReader:n, så det är la där jag måste göra nåt?

Varför går det inte, det är ju en vanlig string och det är väl den som innehåller de felaktiga tecknen? Eller menar du att det inte hjälpte?

EDIT: Det hjälpte nog inte dig. Hmm...

peterbf 2009-02-15 15:11

Testade att hämta Encodingen från min HttpWebResponse, bra förslag förresten. Anyway, det returnerade Unicode (UTF-8), vilket tyvärr inte hjälper mig alls.

Alltså, den innehåller inte felaktiga tecken innan strängen hamnar i StreamReader:n, utan det sker som sagt innuti StreamReader:n. Och jag har ju korrekt Encoding, därför jag frågar om hjälp här.

Vet ni nåt mer man kan testa? ;-)

MrWize 2009-02-15 19:04

Har du provat med att använda Encoding.Unicode istället för Encoding.UTF8?

/Patrik Berggren

Onkelborg 2009-02-15 19:09

Enklast borde väl vara att ansluta med debuggern och se vad som händer? Testa att byta och köra med lite olika encodings? Någonting lär ju fungera

Micke_N 2009-02-16 10:06

Vet inte riktigt om jag förstår problemet. Detta fungerar hur bra som helst för mig direkt i ett nytt VS projekt.

Kod:


if (!IsPostBack)
 * * * * * *{
 * * * * * * * *string formattedUri = @"http://sv.wikipedia.org/wiki/G%C3%B6ran_Persson";

 * * * * * * * *WebRequest webRequest = WebRequest.Create(formattedUri);

 * * * * * * * *HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();

 * * * * * * * *string jsonResponse = string.Empty;

 * * * * * * * *using (StreamReader sr = new StreamReader(response.GetResponseStream()))
 * * * * * * * *{
 * * * * * * * * * *jsonResponse = sr.ReadToEnd();
 * * * * * * * * * *Response.Write(jsonResponse);
 * * * * * * * *}
 * * * * * *}

De första raderna i svaret från StreamReadern är
Kod:


"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"sv\" lang=\"sv\" dir=\"ltr\">\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t\t<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n\t\t<meta name=\"generator\" content=\"MediaWiki 1.15alpha\" />\n\t\t<meta name=\"keywords\" content=\"Göran Persson,Sveriges statsministrar,14 juni,16 mars,17 september,1949,1969,1971,1977,1979,1984\" />\


peterbf 2009-02-16 11:19

Citat:

Originally posted by peterbf@Feb 12 2009, 15:23
Jag gör ett anrop till www.dapper.net för att hämta data från www.wikipedia.org.

Här är WebServiceURL:en
Kod:

private readonly static string WebServiceURL = @"http://www.dapper.net/transform.php?dappName=Fetchwikipediacontent&transformer=JSON&v_SearchTerm={0}&v_Language={1}";

    string formattedUri = String.Format(WebServiceURL, "Göran Hägglund", "EN");

    HttpWebRequest webRequest = GetWebRequest(formattedUri);

    HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();

    Encoding enc = Encoding.GetEncoding(response.CharacterSet);
   
    string jsonResponse = string.Empty;
   
    Encoding encoding = Encoding.UTF8;
   
    using (StreamReader sr = new StreamReader(response.GetResponseStream(), encoding)) {
      jsonResponse = sr.ReadToEnd();
    }

Returnerar den också elegans?

Micke_N 2009-02-16 12:39

Nej den returnerar

Kod:


"{\"error\":\"Something went wrong while the Dapp ran. The error has been logged, and we're looking into it.\"}"


hnn 2009-02-16 14:32

http://www.dapper.net/transform.php?dappNa...d&v_Language=EN

peterbf 2009-02-16 15:47

Sorry. "EN" ska vara "en":

http://www.dapper.net/transform.php?...&v_Language=en

Micke_N 2009-02-17 07:49

jag får precis samma som om man klickar på länken du lade in nu sist med "en" på slutet. Kan dock inte se något direkt svar utan bara de "inputVars" som skickades med.

Kod:

{"dapper":{"status":"OK","dappName":"Fetchwikipediacontent","dappTitle":"Fetch wikipedia content","urls":"\n * * *http:\/\/en.wikipedia.org\/wiki\/David_Beckham\n * * *http:\/\/en.wikipedia.org\/wiki\/Bob_Marley\n * *","applyToUrl":"http:\/\/en.wikipedia.org\/wiki\/David_Beckham","executionTime":"0.0070","ranAt":"2009-02-17 06:46:56","encoding":"UTF-8","ranEventChain":"true","inputVars":"\n * * *en\n * * *G\u00c3\u00b6ran H\u00c3\u00a4gglund\n * *"},"fields":{"ContentParts":[{"value":"To view this page without search results but with all search options, use Special:Search. For more information about searching Wikipedia, see Wikipedia:Searching. For image search there are more options at Wikimedia Commons search.","originalElement":"p","fieldName":"ContentParts"},{"value":"Note: Choosing the right search terms is the key to finding the information you need. If you add terms related to the general subject that the information you are searching for comes under, it may provide better results. Try to avoid searches containing only words in quotes, as they may not find a page you are looking for.","originalElement":"p","fieldName":"ContentParts"}]}}
Det är alltså som så att du redan vid anropet till "dapper" får "G\u00c3\u00b6ran H\u00c3\u00a4gglund\n" det har inget med StreamReadern att göra. ÅÄÖ är ju redan ersatta innan de ens når StreamReadern.

Jag har svårt att tro att detta skulle vara ett problem i .NET utan det är något annat som är strulet. Vill du se vad som händer i StreamReadern i debugg:en kan du sätta upp Visual Studio så att den laddar in .NET källkoden för StreamReadern under debuggen. Finns många exempel på hur man gör och här är ett.

http://blogs.msdn.com/sburke/archive/2008/...ource-code.aspx

Westman 2009-02-17 09:13

Jo jag har också konstaterat att indatat redan är "fel" men eftersom jag har ett liknande problem så tänkte jag ge mig på det en gång till. Jag har provat med diverse konverteringar och jag ger upp nu. Att ersätta \Uxxxx med motsvarande tecken är det enda som fungerat, encoding ger mig bara huvudvärk...

nord84 2009-02-21 10:06

500 spänn till den som löser det :D

digiArt 2009-02-21 10:23

Citat:

Ursprungligen postat av peterbf
Citat:

Ursprungligen postat av peterbf
Jag gör ett anrop till www.dapper.net för att hämta data från www.wikipedia.org.


Här är WebServiceURL:en
Kod:

private readonly static string WebServiceURL = @"http://www.dapper.net/transform.php?dappName=Fetchwikipediacontent&transformer=JSON&v_SearchTerm={0}&v_Language={1}";

 * * * *string formattedUri = String.Format(WebServiceURL, "Göran Hägglund", "EN");

 * * * *HttpWebRequest webRequest = GetWebRequest(formattedUri);

 * * * *HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();

 * * * *Encoding enc = Encoding.GetEncoding(response.CharacterSet);
 * * * *
 * * * *string jsonResponse = string.Empty;
 * * * *
 * * * *Encoding encoding = Encoding.UTF8;
 * * * *
 * * * *using (StreamReader sr = new StreamReader(response.GetResponseStream(), encoding)) {
 * * * * * *jsonResponse = sr.ReadToEnd();
 * * * *}

Returnerar den också elegans?

Du gör ju galet:
Kod:

Encoding enc = Encoding.GetEncoding(response.CharacterSet);
   
    string jsonResponse = string.Empty;
   
    Encoding encoding = Encoding.UTF8;
   
    using (StreamReader sr = new StreamReader(response.GetResponseStream(), encoding)) {
      jsonResponse = sr.ReadToEnd();

ska vara
Kod:

   
    string jsonResponse = string.Empty;
   
    Encoding encoding = Encoding.GetEncoding(response.CharacterSet);
   
    using (StreamReader sr = new StreamReader(response.GetResponseStream(), encoding)) {
      jsonResponse = sr.ReadToEnd();

Fick du ngn hjälp av det jag skickade dig?


Alla tider är GMT +2. Klockan är nu 17:08.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson