![]() |
Delphi-Version: XE2
Charater Definition nicht konsistent Char&AnsiChar
Liebe Delphi-Gemeinde,
beim Programmieren mit XE2 bin ich auf folgende Ungereimtheit gestoßen:
Code:
Diverse Zeichen interpretiert der Compiler als AnsiChar. Warum?
cMyChar1 = 'A'; // For the compiler is this a Char - OK
cMyChar2 ='§'; //$A7 For the compiler is this a AnsiChar - WHY cMyChar3 ='¯'; //$AF For the compiler is this a AnsiChar - WHY Das fällt besonders bei Verwendung in Funktionen auf:
Code:
Der untere Aufruf erzeugt nämlich eine Compilerwarnung wegen implizit cast auf string. Denn in der Regel arbeitet man ja mit strings weiter …
StringOfChar( 'A', 10)
ruft die Funktion function StringOfChar(Ch: WideChar; Count: Integer): UnicodeString; overload; StringOfChar( '§', 10) ruft die Funktion function StringOfChar(Ch: AnsiChar; Count: Integer): AnsiString; overload; Meine BUG-Meldung bei Embarcadero brachte kein zufriedenstellendes Ergebnis. ![]() Ich bin der Meinung, dass das nicht korrekt ist. Alle „typenlosen“ Character-definitionen sollten in einer UniCode-Welt immer als CHAR kompiliert werden. Was meint Ihr dazu?? Ma2xx |
AW: Charater Definition nicht konsistent Char&AnsiChar
Untypisierte Konstanten haben keinen festen Typen, drum sind sie ja untypisiert. :roll:
Dieser wird erst bei der deren Verwendung bestimmt. Im Zweifelsfall wird aber meistens der kleinere Typ verwendet. Chars von #0 bis #$7F werden aber anders behandelt, wie Chars ab #$80 und #$0080 ist nochmals was Anderes. Bei X <= #127 wird, da die Zeichen eine 1:1-Beziehung zwischen ANSI und Unicode besitzen, das Naheliegenste und nicht das Kleinste verwendet (ab D2009 also Unicode). #$xx immer ANSI und #$xxxx immer Unicode #0 bis #127 (oder 'A') im Zweifelsfall Unicode (Unicodeanpassung/-optimierung) #128 bis #255 (oder '§') im Zweifelsfall ANSI (immer das Kleinere) Zitat:
Zeichen ab #128 sind nunmal abhängig von der Codepage und es gibt somit keine direkte Beziehung zwischen ANSI und Unicode. Unter #128 (7-Bit ASCII) gibt es diese Probleme nicht. PS: Wenn du hier im Forum mal etwas suchst: im Deutschen ist #$85 <> #$0085 (ja, ich kenn auch solche Probleme :wall: ) |
AW: Charater Definition nicht konsistent Char&AnsiChar
Es ist für mich trotzdem noch nicht schlüssig.
Der Compiler kennt die CodePage. In den Projektoptionen wird diese zunächst mit 0 vorgespannt. Ich nehmen an, dass dann ein Fallback auf System-CodePage erfolgt. Eine Änderung der CodePage auf 65001 (UTF-8 Unicode) bewirkt interessanterweise, dass ... Sizeof(‚§‘) immernoch = 1 ist, aber StringOfChar(‚§‘, 10) die WideChar-Funktion ruft. Meiner Meinung nach müsste der Compiler per Default alles auf CHAR kompilieren und dabei die eingestellte CodePage zur Interpretation der Zeichen verwenden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 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