Entwickler-Ecke
Internet / Netzwerk - WinINet: unterschiedliche Ergebnisse mit Delphi5 und 2010
Siegbert - Fr 22.10.10 13:11
Titel: WinINet: unterschiedliche Ergebnisse mit Delphi5 und 2010
Hallo zusammen,
habe folgenden Code in Delphi 5 (funktioniert) und in Delphi2010. Unter Delphi5 bekomme ich ein korrektes Ergebnis, bei Delphi2010 nur Sonderzeichensalat. Vermutlich gibt es irgendeinen Unterschied beim Standardzeichensatz oder der Behandlung von Strings zwischen den beiden Delphi-Versionen, aber ich steh' grad auf dem Schlauch und finde trotz langer Suche die Ursache nicht.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| function GetUrlContent(const Url: string): string; var NetHandle: HINTERNET; UrlHandle: HINTERNET; Buffer: array[0..1024] of Char; BytesRead: dWord; begin Result := ''; NetHandle := InternetOpen('Delphi 5.x', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
if Assigned(NetHandle) then begin UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);
if Assigned(UrlHandle) then begin FillChar(Buffer, SizeOf(Buffer), 0); repeat Result := Result + Buffer; FillChar(Buffer, SizeOf(Buffer), 0); InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead); until BytesRead = 0; InternetCloseHandle(UrlHandle); end else raise Exception.CreateFmt('Cannot open URL %s', [Url]);
InternetCloseHandle(NetHandle); end else raise Exception.Create('Unable to initialize Wininet'); end; |
Ich habe den Aufruf in Delphi 5 schon längere Zeit in Verwendung. Hier zur Verdeutlichung nur die relevanten Stellen des Aufrufs, zusätzlich mit drei Versuchen der Zuweisung an ein Memo (wie in Delphi5), an einen String und an einen WideString, alle mit dem selben falschen Ergebnis in Delphi2010.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| Procedure GetHttpContent; var URL: String; memo: TMemo; TestWString:WideString; TestString:String;
begin URL:='http:http://webservices.amazon.de/onca/xml?AWSAccessKeyId=[entfernt]&IdType=EAN&ItemId=9783785537541&Operation=ItemLookup&ResponseGroup=Medium%2COfferFull&SearchIndex=All&Service=AWSECommerceService&Timestamp=2010-10-22T11%3A30%3A06Z&Version=2009-01-06&Signature=U2JSWkT30S/Mq4VUCXlrDBwjDckjJ5DVytgBdaH2obo%3D'; memo.Add(GetUrlContent(URL)); TestWString:=GetUrlContent(URL); TestString:=GetUrlContent(URL); end; |
Ergebnis mit Delphi5:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| <?xml version="1.0" ?> <ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2009-01-06"> <OperationRequest> <HTTPHeaders> <Header Name="UserAgent" Value="Mozilla/4.0 (compatible; ICS)"> </Header> </HTTPHeaders> <RequestId>eb82c871-b7d9-400c-ac8f-6e8d39b437ed</RequestId> <Arguments> <Argument Name="Operation" Value="ItemLookup"> </Argument> <Argument Name="Service" Value="AWSECommerceService"> </Argument> ... |
Ergebnis mit Delphi2010:
Quelltext
1:
| 㼼浸'#$206C'敶獲潩㵮ㄢ〮㼢ਾ䤼整䱭潯畫䕰牲牯敒灳湯敳砠汭獮∽瑨灴⼺支獣愮慭潺慮獷挮浯搯捯㈯〰ⴹ'#$3130'〭⼶㸢䔼牲牯㰾潃敤匾杩慮畴敲潄獥潎䵴瑡档⼼潃敤㰾敍獳条㹥桔'#$2065'敲畱獥⁴楳湧瑡牵'#$2065'敷挠污畣慬整'#$2064'潤獥渠瑯洠瑡档琠敨猠杩慮畴敲礠畯瀠潲楶敤'#$2E64'䌠敨正礠畯'#$2072'坁⁓敓牣瑥䄠捣獥'#$2073'敋⁹湡'#$2064'楳湧湩'#$2067'敭桴摯'#$202E'潃獮汵⁴桴'#$2065'敳癲捩'#$2065'潤畣敭瑮瑡潩'#$206E'潦'#$2072'敤慴汩'#$2E73'⼼敍獳条㹥⼼牅潲㹲刼煥敵瑳䑉显㌱昱㠲ⴲ㌳㔱㐭㜴ⴷ㠹敥戭㉦㠲晡〲㤳㱣刯煥敵瑳䑉㰾䤯整䱭潯畫䕰牲牯敒灳湯敳>'#$D#$A |
Wo liegt mein Fehler???
EDIT: auch mit UTF8Decode (bzw. Verwendung von AnsiString) geht es nicht. Dann bekomme ich als Ergebnis lauter Fragezeichen (?????), die Rückgabe scheint also kein UTF-8 Unicode zu sein, aber was dann (und warum bei Delphi2010 anders als bei Delphi5??)?.
Danke für alle Tipps...
Moderiert von
Narses: Code- durch Delphi-Tags ersetzt
Delete - Fr 22.10.10 13:19
Hat es sich eigentlich immer noch nicht rumgesprochen, dass Delphi2010 standardmäßig Unicode verwendet?
Siegbert - Fr 22.10.10 13:35
Hallo Luckie,
ich habe ja schon geschrieben, dass ich ein Unicode-Problem vermute. Aber das Wissen um das Problem heißt nicht, das man auch die Lösung kennt. Wenn Du weißt, was ich falsch gemacht habe, dann gib mir bitte einen kleinen Tipp, wie es richtig sein müsste...
Gruß,
Siegbert
LSanchez - Fr 22.10.10 13:59
Wenn du Ansichar verwendest, geht es wieder.
Buffer: array[0..1024] of AnsiChar;
Gruß
Luis Sanchez
Siegbert - Fr 22.10.10 16:27
Hallo Luis,
Danke, das ändern von Array of Char in Array of AnsiChar war die Lösung! Peinlich - hätte ich auch selbst drauf kommen können. Aber manchmal hat man Tomaten auf den Augen :oops:
Wochenende gerettet... :D
Viele Grüße,
Siegbert
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!