Was ist der Unterschied zwischen WideChar und AnsiChar?

8

Ich aktualisiere einen älteren Delphi-Code (ab 2003) zu Delphi Architect XE und stoße auf ein paar Probleme. Ich bekomme eine Reihe von Fehlern, wenn es inkompatible Typen gibt. Diese Fehler treten in Delphi 6 nicht auf, daher muss ich annehmen, dass dies darauf zurückzuführen ist, dass die Dinge aktualisiert wurden.

Ich weiß ehrlich nicht, was der Unterschied zwischen PAnsiChar und PWideChar ist, aber Delphi kennt den Unterschied und lässt mich nicht kompilieren. Wenn ich wüsste, was die Unterschiede sind, könnte ich vielleicht herausfinden, was ich verwenden soll oder wie ich das beheben kann.

    
Daisetsu 08.02.2011, 23:47
quelle

2 Antworten

18

Kurz: vor Delphi 2009 war der ursprüngliche String-Typ in Delphi ANSI CHAR: Jedes Zeichen in jeder Zeichenfolge wurde als 8-Bit-Zeichen dargestellt. Beginnend mit Delphi 2009 wurden die Strings von Delphi UNICODE, wobei die UTF-16-Notation verwendet wurde: Jetzt verwendet das grundlegende Zeichen 16 Datenbits (2 Bytes), und Sie müssen wahrscheinlich nicht viel über die Unicode-Codepunkte wissen, die als zwei dargestellt werden aufeinanderfolgende 16-Bit-Zeichen.

Die 8-Bit-Zeichen werden "Ansi-Zeichen" genannt. Ein PAnsiChar ist ein Zeiger auf 8-Bit-Zeichen. Die 16-Bit-Zeichen werden "Wide Chars" genannt. Ein PWideChar ist ein Zeiger auf 16-Bit-Zeichen. Delphi kennt den Unterschied und tut gut, wenn es Ihnen nicht erlaubt, die zwei zu mischen!

Weitere Informationen

Hier ist ein beliebter Link zu Unicode: Das absolute Minimum, das jeder Softwareentwickler unbedingt, unbedingt über Unicode und Zeichensätze wissen muss

Weitere Informationen zum Migrieren von Delphi zu Unicode finden Sie hier: Neues Whitepaper: Delphi-Unicode-Migration für mere Sterbliche

Sie können SO auch nach "Delphi Unicode migration" suchen.

    
Cosmin Prund 09.02.2011, 00:09
quelle
9

Vor ein paar Jahren wurde der Standardzeichentyp in Delphi von AnsiChar (Einzelbytevariable, die ein ANSI-Zeichen darstellt) in WideChar geändert (Zweibytevariable, die ein UTF16-Zeichen darstellt). Der char -Typ ist jetzt ein Alias ​​für WideChar anstelle von AnsiChar , der string -Typ ist jetzt ein Alias ​​für UnicodeString (eine UTF-16 Unicode-Version von Delphis traditionellem String-Typ) anstelle von AnsiString und PChar type ist jetzt ein Alias ​​für PWideChar anstelle von PAnsiChar .

Der Compiler kann sich um viele Conversions selbst kümmern, aber es gibt ein paar Probleme:

  1. Wenn Sie String-Zeiger-Typen verwenden, z. B. PChar , müssen Sie sicherstellen, dass der Zeiger auf den richtigen Datentyp zeigt, und der Compiler kann dies nicht immer überprüfen.
  2. Wenn Sie Strings an var -Parameter übergeben, muss der Variablentyp identisch sein. Dies kann komplizierter sein, wenn Sie nun zwei String-Typen verwenden müssen.
  3. Wenn Sie string als praktischen Byte-Array-Puffer zum Speichern beliebiger Daten anstelle einer Variablen verwenden, die Text enthält, funktioniert das nicht als UnicodeString . Stellen Sie sicher, dass diese als Umgehung für RawByteString deklariert sind.
  4. Wenn Sie mit String-Byte-Längen arbeiten, z. B. beim Lesen oder Schreiben von / aus einem TStream, stellen Sie sicher, dass Ihr Code nicht davon ausgeht, dass ein char ein Byte lang ist.

Sehen Sie sich Delphi-Unicode-Migration für Mere Mortals an, um weitere Tricks und Ratschläge zu erhalten, wie Sie dies zum Laufen bringen können . Es ist nicht so schwer wie es klingt, aber es ist auch nicht trivial. Viel Glück!

    
Mason Wheeler 09.02.2011 00:07
quelle

Tags und Links