Wie funktionieren die neuen Zeichenkettentypen in Delphi 2009/2010?

7

Ich muss eine große Legacy-Anwendung in Delphi 2009 konvertieren, die Strings, AnsiStrings, WideStrings und UTF8-Daten überall verwendet und es fällt mir schwer zu verstehen, wie die neuen Stringtypen funktionieren und wie sie verwendet werden sollen / p>

Die Anwendung unterstützt voll Unicode mit TntUnicodeControls und es gibt DLLs von Drittanbietern, die Zeichenfolgen in bestimmten Kodierungen benötigen, meistens UTF8 und UTF16, was die Konvertierungsaufgabe nicht so trivial macht, wie man vermuten würde.

Ich habe besonders Probleme mit den C DLL-Aufrufen und wähle den richtigen Typ. Ich habe auch den Eindruck, dass es viele implizite String-Konvertierungen gibt, da einer der DLL immer UTF-8-codierte Strings zu empfangen scheint, egal wie die Delphi-Zeichenkette codiert ist.

Kann jemand bitte einen kurzen Überblick über die neuen Delphi 2009 String-Typen UnicodeString und RawByteString geben, vielleicht einige Anwendungshinweise und mögliche Fehler bei der Konvertierung einer Anwendung vor 2009?

    
Daniel Rikowski 09.09.2009, 12:27
quelle

5 Antworten

8

Sehen Sie sich meinen CodeRage 4 an diesem Freitag über "Unicode und andere Codierungen in Ihren Programmen verwenden" an oder warten Sie bis zum nächsten Wiederholung davon ist online verfügbar.

Ich werde einige Codierungen behandeln und das Stringformat erklären.

Die Slides werden in Kürze verfügbar sein (ich werde versuchen, sie heute online zu bringen) und viele Verweise auf Dinge enthalten, die du im Internet lesen solltest (aber ich muss zugeben, dass ich den Link zu Joel in Unicode vergessen habe, den eed3si9n gepostet hat ).

Wird diese Antwort heute mit den Uploads und den Links bearbeiten.

Bearbeiten:

Wenn Sie ein kleines Beispiel haben, wo Sie zeigen können, dass Ihre C / C ++ DLL die Zeichenfolgen UTF8-codiert empfängt, aber dachte, sie sollten anders codiert werden, bitte posten Sie es (mailen Sie mir; fast alles bei den pluimers dot com kommt zu mir , besonders wenn Sie meinen Vornamen vor dem at-Zeichen verwenden.)

Sitzungsmaterialien können nun heruntergeladen werden , einschließlich der Sitzung "Verwenden von Unicode und anderen Codierungen in Ihren Programmen".

Dies sind Links von dieser Sitzung:

Lesen Sie diese:

  1. Marco Cantu, Whitepaper " Delphi und Unicode "
  2. Marco Cantu, Präsentation " Delphi und Unicode "
  3. Nick Hodges, Whitepaper " Delphi in einer Unicode-Welt "

Relevante Online-Hilfethemen:

  1. Was ist neu in Delphi und C ++ Builder 2009
  2. ?
  3. String-Typen: Basis: ShortString, AnsiString, WideString, UnicodeString
  4. String-Typen: Unicode (einschließlich der internen Speicherlayouts der String-Typen )
  5. String-Typen: Aktivieren für Unicode
  6. String-Typen: RawByteString (AnsiString mit CodePage $ ffff)
  7. String-Typen: UTF8String (AnsiString mit CodePage 65001)
  8. Zeichenfolge & lt; - & gt; PChar-Konvertierungen: PChar-Grundlagen
  9. Zeichenfolge & lt; - & gt; PChar-Conversions: Rückgabe einer lokalen PChar-Variable
  10. Zeichenfolge & lt; - & gt; PChar-Conversions: Übergeben einer lokalen Variable als PChar

Hoffe, das bringt dich weiter. Wenn nicht, mailen Sie mir und ich werde versuchen, die Antwort hier zu erweitern.

    
Jeroen Wiert Pluimers 09.09.2009, 15:31
quelle
11
___ answer1403864 ___

Beachten Sie, dass es nicht nur echten String-Code trifft. Es trifft auch auf Code, bei dem PCHAR zum Durchsuchen von Puffern oder zur Schnittstelle mit APIs verwendet wird.

z. Initialisierungscode von Headern, die die DLL dynamisch laden (getprocedureaddress / loadlibray)

    
___ qstnhdr ___ Wie funktionieren die neuen Zeichenkettentypen in Delphi 2009/2010? ___ antwort1399419 ___

Siehe Delphi und Unicode , ein Whitepaper von Marco Cantù und ich denke Das absolute Minimum, das jeder Softwareentwickler absolut, positiv über Unicode und Zeichensätze (keine Ausreden!) wissen sollte , geschrieben von Joel.

Ein Fehler besteht darin, dass der standardmäßige Win32-API-Aufruf der Verwendung der W (Wide String) -Version anstelle der A (ANSI) -Version zugeordnet wurde, zum Beispiel ShellExecuteA Wenn Ihr Code einen komplizierten Zeigercode unter Annahme eines internen Layouts von AnsiString , es wird abgebrochen. Ein Fallback besteht darin, PChar durch PAnsiChar , Char durch AnsiChar , string durch AnsiString zu ersetzen und A am Ende des Win32-API-Aufrufs für diesen Codeabschnitt anzufügen. Nachdem der Code tatsächlich kompiliert und normal ausgeführt wurde, können Sie Ihren Code so umgestalten, dass string ( UnicodeString ) verwendet wird.

    
___ qstntxt ___

Ich muss eine große Legacy-Anwendung in Delphi 2009 konvertieren, die Strings, AnsiStrings, WideStrings und UTF8-Daten überall verwendet und es fällt mir schwer zu verstehen, wie die neuen Stringtypen funktionieren und wie sie verwendet werden sollen / p>

Die Anwendung unterstützt voll Unicode mit TntUnicodeControls und es gibt DLLs von Drittanbietern, die Zeichenfolgen in bestimmten Kodierungen benötigen, meistens UTF8 und UTF16, was die Konvertierungsaufgabe nicht so trivial macht, wie man vermuten würde.

Ich habe besonders Probleme mit den C DLL-Aufrufen und wähle den richtigen Typ. Ich habe auch den Eindruck, dass es viele implizite String-Konvertierungen gibt, da einer der DLL immer UTF-8-codierte Strings zu empfangen scheint, egal wie die Delphi-Zeichenkette codiert ist.

Kann jemand bitte einen kurzen Überblick über die neuen Delphi 2009 String-Typen UnicodeString und RawByteString geben, vielleicht einige Anwendungshinweise und mögliche Fehler bei der Konvertierung einer Anwendung vor 2009?

    
___ answer1409315 ___

Es scheint, dass fast alle meine Probleme von der automatischen Konvertierung von Zuweisungen nach %code% kommen.

Ich hatte bereits alten Code mit %code% , nur um mir zu helfen zu überlegen, welche Art von String eine Variable enthalten sollte.

Als ich meine Anwendung portierte, ersetzte ich %code% durch %code% aus dem gleichen Grund, aber der Code hing davon ab, dass %code% nur ein Alias ​​für (classic) %code%

war

Jetzt, mit der automatischen Konvertierung, ist diese Annahme nicht mehr wahr, was viele Probleme verursachte.

Seien Sie vorsichtig, wenn Sie %code% bei der Portierung von Delphi-Code vor 2009 verwenden!

    
___ answer5140987 ___

Eine weitere Sache, auf die beim Übergeben von Strings zwischen DLLs geachtet werden muss, die mit verschiedenen Versionen von Delphi oder C ++ Builder erstellt wurden, ist, dass ab 2009 der StrRec-Teil von AnsiStringBase zwei zusätzliche Felder erhielt; codePage und elemSize. Sie sind jeweils 2 Bytes (short ints), so dass die Größe von StrRec jetzt 12 Byte statt 8 ist. Dies kann zu Problemen mit ungültigen Zeigerausfällen bei der Speicherzuweisung und -zerstörung führen, auch wenn der Datenteil der Zeichenfolge scheinbar in Ordnung zu übertragen scheint / p>     

___ answer1400413 ___

Sehen Sie sich meinen CodeRage 4 an diesem Freitag über "Unicode und andere Codierungen in Ihren Programmen verwenden" an oder warten Sie bis zum nächsten Wiederholung davon ist online verfügbar.

Ich werde einige Codierungen behandeln und das Stringformat erklären.

Die Slides werden in Kürze verfügbar sein (ich werde versuchen, sie heute online zu bringen) und viele Verweise auf Dinge enthalten, die du im Internet lesen solltest (aber ich muss zugeben, dass ich den Link zu Joel in Unicode vergessen habe, den eed3si9n gepostet hat ).

Wird diese Antwort heute mit den Uploads und den Links bearbeiten.

Bearbeiten:

Wenn Sie ein kleines Beispiel haben, wo Sie zeigen können, dass Ihre C / C ++ DLL die Zeichenfolgen UTF8-codiert empfängt, aber dachte, sie sollten anders codiert werden, bitte posten Sie es (mailen Sie mir; fast alles bei den pluimers dot com kommt zu mir , besonders wenn Sie meinen Vornamen vor dem at-Zeichen verwenden.)

Sitzungsmaterialien können nun heruntergeladen werden , einschließlich der Sitzung "Verwenden von Unicode und anderen Codierungen in Ihren Programmen".

Dies sind Links von dieser Sitzung:

Lesen Sie diese:

  1. Marco Cantu, Whitepaper " Delphi und Unicode "
  2. Marco Cantu, Präsentation " Delphi und Unicode "
  3. Nick Hodges, Whitepaper " Delphi in einer Unicode-Welt "

Relevante Online-Hilfethemen:

  1. Was ist neu in Delphi und C ++ Builder 2009
  2. ?
  3. String-Typen: Basis: ShortString, AnsiString, WideString, UnicodeString
  4. String-Typen: Unicode (einschließlich der internen Speicherlayouts der String-Typen )
  5. String-Typen: Aktivieren für Unicode
  6. String-Typen: RawByteString (AnsiString mit CodePage $ ffff)
  7. String-Typen: UTF8String (AnsiString mit CodePage 65001)
  8. Zeichenfolge & lt; - & gt; PChar-Konvertierungen: PChar-Grundlagen
  9. Zeichenfolge & lt; - & gt; PChar-Conversions: Rückgabe einer lokalen PChar-Variable
  10. Zeichenfolge & lt; - & gt; PChar-Conversions: Übergeben einer lokalen Variable als PChar

Hoffe, das bringt dich weiter. Wenn nicht, mailen Sie mir und ich werde versuchen, die Antwort hier zu erweitern.

    
___
Eugene Yokota 09.09.2009 12:33
quelle
0

Beachten Sie, dass es nicht nur echten String-Code trifft. Es trifft auch auf Code, bei dem PCHAR zum Durchsuchen von Puffern oder zur Schnittstelle mit APIs verwendet wird.

z. Initialisierungscode von Headern, die die DLL dynamisch laden (getprocedureaddress / loadlibray)

    
Marco van de Voort 10.09.2009 07:40
quelle
0

Es scheint, dass fast alle meine Probleme von der automatischen Konvertierung von Zuweisungen nach UTF8String kommen.

Ich hatte bereits alten Code mit UTF8String , nur um mir zu helfen zu überlegen, welche Art von String eine Variable enthalten sollte.

Als ich meine Anwendung portierte, ersetzte ich AnsiString durch UTF8String aus dem gleichen Grund, aber der Code hing davon ab, dass UTF8String nur ein Alias ​​für (classic) AnsiString

war

Jetzt, mit der automatischen Konvertierung, ist diese Annahme nicht mehr wahr, was viele Probleme verursachte.

Seien Sie vorsichtig, wenn Sie UTF8String bei der Portierung von Delphi-Code vor 2009 verwenden!

    
Daniel Rikowski 11.09.2009 06:36
quelle
0

Eine weitere Sache, auf die beim Übergeben von Strings zwischen DLLs geachtet werden muss, die mit verschiedenen Versionen von Delphi oder C ++ Builder erstellt wurden, ist, dass ab 2009 der StrRec-Teil von AnsiStringBase zwei zusätzliche Felder erhielt; codePage und elemSize. Sie sind jeweils 2 Bytes (short ints), so dass die Größe von StrRec jetzt 12 Byte statt 8 ist. Dies kann zu Problemen mit ungültigen Zeigerausfällen bei der Speicherzuweisung und -zerstörung führen, auch wenn der Datenteil der Zeichenfolge scheinbar in Ordnung zu übertragen scheint / p>     

Steve 28.02.2011 10:48
quelle

Tags und Links