![]() |
Verwenden der LazUTF8 Unit verändert Ergebnis von TIdURI.URLDecode
Test 1: Free Pascal 3.0.4 Programm ohne Unit LazUTF8:
Delphi-Quellcode:
Ausgabe: ÄÖÜ
program FPCTest;
uses IdURI; begin WriteLn(TIdURI.URLDecode('%C3%84%C3%96%C3%9C')); ReadLn; end. Test 2: wie Test 1, aber mit Unit LazUTF8 (für UTF-8 Unterstützung, ![]()
Delphi-Quellcode:
Ausgabe: ???
program FPCTest;
uses IdURI, LazUTF8; begin WriteLn(TIdURI.URLDecode('%C3%84%C3%96%C3%9C')); ReadLn; end. Man kann zwar TIdURI.URLDecode direkt im Indy Sourcecode anpassen, in etwa so:
Delphi-Quellcode:
- aber dabei ist es nicht möglich, anhand eines Flags zu "erkennen" ob der Code mit oder ohne der Unit LazUTF8 kompiliert wird.
{$IFDEF FPC}
Result := string(AByteEncoding.GetString(LBytes)); {$ELSE} {$IFDEF STRING_IS_ANSI} EnsureEncoding(ADestEncoding, encOSDefault); CheckByteEncoding(LBytes, AByteEncoding, ADestEncoding); SetString(Result, PAnsiChar(LBytes), Length(LBytes)); {$ELSE} Result := AByteEncoding.GetString(LBytes); {$ENDIF} {$ENDIF} Relativ naheliegend wäre ein eigenes Symbol zu definieren:
Delphi-Quellcode:
{$IFDEF USES_LAZUTF8}
Result := string(AByteEncoding.GetString(LBytes)); {$ELSE} {$IFDEF STRING_IS_ANSI} EnsureEncoding(ADestEncoding, encOSDefault); CheckByteEncoding(LBytes, AByteEncoding, ADestEncoding); SetString(Result, PAnsiChar(LBytes), Length(LBytes)); {$ELSE} Result := AByteEncoding.GetString(LBytes); {$ENDIF} {$ENDIF} Oder habe ich noch eine Möglichkeit übersehen, mit der man das Ändern des Indy-Quelltext vermeiden könnte? |
AW: Verwenden der LazUTF8 Unit verändert Ergebnis von TIdURI.URLDecode
Hallo,
und wenn die die Unit-Reihenfolge umdrehst? Hier ![]() Then add LazUTF8 unit in the uses section of main program file. It must be near the beginning, just after the critical memory managers and threading stuff (e.g. cmem, heaptrc, cthreads). |
AW: Verwenden der LazUTF8 Unit verändert Ergebnis von TIdURI.URLDecode
Zitat:
|
AW: Verwenden der LazUTF8 Unit verändert Ergebnis von TIdURI.URLDecode
Hallo,
geht ja noch weiter. Warum steht da near beginning? Die letzte Unit kann ja die Initialisierungen der anderen wieder aufheben. Aber bei Lazarus bin ich raus ... |
AW: Verwenden der LazUTF8 Unit verändert Ergebnis von TIdURI.URLDecode
Zitat:
Das hat den Zweck, Fehler auszuschliessen die durch verspätete Initialisierung entstehen könnten. Damit is gemeint, dass wenn man zum Beispiel
Delphi-Quellcode:
schreibt, und in MyUnit1, MyUnit2, OtherUnit, OtherStuff bereits initialization Code enthalten ist, der vor dem in LazUTF8 ausgeführt wird, dann ist dort noch nicht die UTF-8 Unterstützung aktiviert und "üble Dinge könnten passieren".
uses
MemoryManager, ThreadStuff, MyUnit1, MyUnit2, OtherUnit, OtherStuff, LazUTF8; Empfohlen wird daher LazUTF8 direkt nach Memory Manager und Thread-Unterstützungs Units zu platzieren:
Delphi-Quellcode:
So kann nicht mehr viel schief gehen.
uses
MemoryManager, ThreadStuff, LazUTF8, MyUnit1, MyUnit2, OtherUnit, OtherStuff; |
AW: Verwenden der LazUTF8 Unit verändert Ergebnis von TIdURI.URLDecode
Und was passiert bei
Delphi-Quellcode:
program FPCTest;
uses LazUTF8, IdURI; // statt bisher // uses IdURI, LazUTF8; begin WriteLn(TIdURI.URLDecode('%C3%84%C3%96%C3%9C')); ReadLn; end. |
AW: Verwenden der LazUTF8 Unit verändert Ergebnis von TIdURI.URLDecode
Zitat:
=> die Reihenfolge der Units hat keine Auswirkung auf das Ergebnis |
AW: Verwenden der LazUTF8 Unit verändert Ergebnis von TIdURI.URLDecode
Wenn Du LazUTF8 verwendest, willst Du ja auch UTF8...
Klar wäre es schöner, wenn hier eine automatische Typenkonvertierung stattfinden würde, aber so musst Du halt per Hand ran: 1. wie wäre es den Rückgabewer an die Codepage der Konsole, auf der Du ausgibst, anzupassen (vermutlich mit UTF8ToWinCP)? 2. Oder mit SetConsoleOutputCP die Codepage der Konsole auf UTF8 zu ändern? |
AW: Verwenden der LazUTF8 Unit verändert Ergebnis von TIdURI.URLDecode
Zitat:
Die Konsole ist nicht entscheidend, dieses Programm liefert "URLDecode hat das erwartete Ergebnis zur├╝ckgegeben"
Delphi-Quellcode:
Einen Workaround für TIdURI.URLDecode habe ich ja schon oben besschrieben:
program FPCTest;
uses IdURI, LazUTF8; begin if TIdURI.URLDecode('%C3%84%C3%96%C3%9C') <> 'ÄÖÜ' then WriteLn('URLDecode hat nicht das erwartete Ergebnis zurückgegeben') else WriteLn('URLDecode hat das erwartete Ergebnis zurückgegeben'); ReadLn; end.
Delphi-Quellcode:
Was aber noch zu verbessern wäre: wie könnte man geschickt (mit minimalen Änderungen an Indy) erkennen ob LazUTF8 bereits initialisiert wurde?
{$IFDEF FPC}
Result := string(AByteEncoding.GetString(LBytes)); {$ELSE} {$IFDEF STRING_IS_ANSI} EnsureEncoding(ADestEncoding, encOSDefault); CheckByteEncoding(LBytes, AByteEncoding, ADestEncoding); SetString(Result, PAnsiChar(LBytes), Length(LBytes)); {$ELSE} Result := AByteEncoding.GetString(LBytes); {$ENDIF} {$ENDIF} |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz