Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Charater Definition nicht konsistent Char&AnsiChar (https://www.delphipraxis.net/165700-charater-definition-nicht-konsistent-char-ansichar.html)

ma2xx 12. Jan 2012 08:42

Delphi-Version: XE2

Charater Definition nicht konsistent Char&AnsiChar
 
Liebe Delphi-Gemeinde,

beim Programmieren mit XE2 bin ich auf folgende Ungereimtheit gestoßen:
Code:
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
Diverse Zeichen interpretiert der Compiler als AnsiChar. Warum?
Das fällt besonders bei Verwendung in Funktionen auf:
Code:
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;
Der untere Aufruf erzeugt nämlich eine Compilerwarnung wegen implizit cast auf string. Denn in der Regel arbeitet man ja mit strings weiter …

Meine BUG-Meldung bei Embarcadero brachte kein zufriedenstellendes Ergebnis.
http://qc.embarcadero.com/wc/qcmain.aspx?d=102347

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

himitsu 12. Jan 2012 08:45

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:

WHY
Du hast keinen Typen angegeben, deine PAS ist bestimmt ANSI-kodiert und um einer unkontrollierten Umkodierung zu entgehen, wird eben nicht umkodiert und es bleibt ANSI.
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: )

ma2xx 12. Jan 2012 09:53

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 02:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz