___ 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:
- Marco Cantu, Whitepaper " Delphi und Unicode "
- Marco Cantu, Präsentation " Delphi und Unicode "
- Nick Hodges, Whitepaper " Delphi in einer Unicode-Welt "
Relevante Online-Hilfethemen:
- Was ist neu in Delphi und C ++ Builder 2009
?
- String-Typen: Basis: ShortString, AnsiString, WideString, UnicodeString
- String-Typen: Unicode (einschließlich der internen Speicherlayouts der String-Typen )
- String-Typen: Aktivieren für Unicode
- String-Typen: RawByteString (AnsiString mit CodePage $ ffff)
- String-Typen: UTF8String (AnsiString mit CodePage 65001)
- Zeichenfolge & lt; - & gt; PChar-Konvertierungen: PChar-Grundlagen
- Zeichenfolge & lt; - & gt; PChar-Conversions: Rückgabe einer lokalen PChar-Variable
- 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.
___