Autor Beitrag
Siegbert
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Fr 22.10.10 13:11 
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.

ausblenden volle Höhe 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..1024of Char;
  BytesRead: dWord;
begin
  Result := '';
  NetHandle := InternetOpen('Delphi 5.x', INTERNET_OPEN_TYPE_PRECONFIG, nilnil0);

  if Assigned(NetHandle) then
  begin
    UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil0, INTERNET_FLAG_RELOAD, 0);

    if Assigned(UrlHandle) then
      { UrlHandle valid? Proceed with download }
    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
      { UrlHandle is not valid. Raise an exception. }
      raise Exception.CreateFmt('Cannot open URL %s', [Url]);

    InternetCloseHandle(NetHandle);
  end
  else
    { NetHandle is not valid. Raise an exception }
    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.
ausblenden 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:
ausblenden 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:
ausblenden 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 user profile iconNarses: Code- durch Delphi-Tags ersetzt


Zuletzt bearbeitet von Siegbert am Fr 22.10.10 13:33, insgesamt 1-mal bearbeitet
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 22.10.10 13:19 
Hat es sich eigentlich immer noch nicht rumgesprochen, dass Delphi2010 standardmäßig Unicode verwendet?
Siegbert Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26
Erhaltene Danke: 8



BeitragVerfasst: Fr 22.10.10 13:59 
Wenn du Ansichar verwendest, geht es wieder.

Buffer: array[0..1024] of AnsiChar;

Gruß

Luis Sanchez
Siegbert Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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