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.
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