Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Delphi 2009: String, UnicodeString oder WideString? (https://www.delphipraxis.net/148286-delphi-2009-string-unicodestring-oder-widestring.html)

romber 26. Feb 2010 17:27


Delphi 2009: String, UnicodeString oder WideString?
 
Hallo!

Nachdem ich hier im Forum einige wiedersprechende Äußerungen zu den o.g. Datentypen gelesen habe, bin ich jetzt ein wenig verwirrt und möchte endlich wissen, welches von o.g. Datentypen ich verwenden soll. Ich benutze Delphi 2009 und arbeite an einem Projekt, dass mit Unicode-Daten zu tun hat. Z.B. bekomme ich von einem HTTP-Webservice die Unicode-Daten geliefert, lade diese in einem String und gebe für weitere Bearbeitung weiter. Welchen der o.g. String-Typen soll ich dabei deklarieren? Welche Unterschied zwischen String und UnicodeString und String und WideString in Delphi 2009?

daywalker9 26. Feb 2010 18:24

Re: Delphi 2009: String, UnicodeString oder WideString?
 
[edit] About String Types
A string represents a sequence of characters. Delphi supports the following predefined string types.

String types

Type Maximum length Memory required Used for
ShortString
255 characters
2 to 256 bytes
Backward compatibility

AnsiString
~2^31 characters
4 bytes to 2GB
8-bit (ANSI) characters, DBCS ANSI, MBCS ANSI, Unicode characters, etc.

UnicodeString
~2^30 characters
4 bytes to 2GB
Unicode characters, 8-bit (ANSI) characters, multi-user servers and multi-language applications

WideString
~2^30 characters
4 bytes to 2GB
Unicode characters; multi-user servers and multi-language applications. UnicodeString is generally preferred to WideString, except for COM applications.

romber 26. Feb 2010 19:04

Re: Delphi 2009: String, UnicodeString oder WideString?
 
Vielen Dank für die schnelle Antwort!
Diese Informatinen habe ich auch gefunden. Was ist dann mit dem einfachen String?
Wie ich schon erwähnt habe, habe ich bereits viele Informationen über diese Typen gelesen, manchmal widerspachen sich die Informationen. Deswegen brauche ich jetzt eine konkrete Aussage. Was muss ich in meinem Fall benutzen: String, UnicodeString, WideString oder sonst noch was?

daywalker9 26. Feb 2010 19:10

Re: Delphi 2009: String, UnicodeString oder WideString?
 
On the Win32 platform, the compiler interprets string (when it appears without a bracketed number after it) as UnicodeString.

Wenn du zB

ANSI-String

Delphi-Quellcode:
var
 MeiNString : String[200];

UnicodeString

Delphi-Quellcode:
var
 MeiNString : String;

romber 26. Feb 2010 19:18

Re: Delphi 2009: String, UnicodeString oder WideString?
 
Also string?

daywalker9 26. Feb 2010 19:20

Re: Delphi 2009: String, UnicodeString oder WideString?
 
Ja, damit machst du nichts falsch. Unicode Daten machen kein Problem mit dem typ "string"

romber 26. Feb 2010 19:20

Re: Delphi 2009: String, UnicodeString oder WideString?
 
Vielen Dank!

cookie22 26. Feb 2010 19:50

Re: Delphi 2009: String, UnicodeString oder WideString?
 
Zitat:

Zitat von daywalker9
On the Win32 platform, the compiler interprets string (when it appears without a bracketed number after it) as UnicodeString.

Wenn du zB

ANSI-String

Delphi-Quellcode:
var
 MeiNString : String[200];

UnicodeString

Delphi-Quellcode:
var
 MeiNString : String;

dein ansi string ist aber ein short string.

ein ansi string ab d 2009 sieht so aus:
Delphi-Quellcode:
var
 MeiNString : AnsiString;

himitsu 26. Feb 2010 20:20

Re: Delphi 2009: String, UnicodeString oder WideString?
 
programmintern:

die "systemabhängigen" Typen

> String, Char, Integer, Cardinal

somit paßt es sich immer an den Compiler an
(z.B. ist der String bis D2007 ein AnsiString und ab D2009 ist es ein UnicodeString)


programmextern oder wenn man geziehlt einen bestimmten Typen benötigt:

(also beim Speichern, Datenübertagung oder der Komunikation mit DLLs, COM-Services und anderen externen Interfaces)

die statischen Typen

> ShortString (String[x]), AnsiString, WideString, UnicodeString, LongInt (und Co.), PAnsiChar, PWideChar

alles entsprechend der Anforderungen an die Daten und Speicherveraltung

ATS3788 3. Nov 2014 16:20

AW: Delphi 2009: String, UnicodeString oder WideString?
 
Ich weiß das dies ein alter Eintrag ist,
aber es passt ganz gut.

ein string wurde früher so gespeichert

Byte 1 die länge des strings
Byte 2 fortlaufend der Inhalt des strings
OK

wie ist das Heute Mit string und WideString

bei string
Byte1 + Byte 2 länge des strings
Byte 3 + Byte 4 fortlaufend der Inhalt des strings

ist das richtig ?

und wie wird ein Widestring gespeichert ?
was ist der Unterschied zum string ?

und wird der AnsiString wie der alte String gespeichert ?

mkinzler 3. Nov 2014 16:27

AW: Delphi 2009: String, UnicodeString oder WideString?
 
Das mit der Länge gilt eigentlich seit D1 nicht mehr, sondern nur für ShortString. ( String wurde aber u.U. je nach Einstellung bei D < D2009 als ShortString implementiert).

Bei AnsiString/UnicodeString ( außer bei nextgen) beginnt der Index zwar ab 1 (Rückwärtskompatibilität), die Implementierung ist aber wie bei C eine 0 terminierter String ( an Stelle 1 steht ein Zeiger auf den eigentlichen String)

himitsu 3. Nov 2014 17:09

AW: Delphi 2009: String, UnicodeString oder WideString?
 
Für den genauen Aufbau siehe System.pas, wo es auch seit 2009 ein paar Funktionen zum Auslesen/Bearbeiten gibt, vorallem von der CodePage.


WideString geht schon immer auf die OleAuth32.dll und stellt quasi nur einen Wrapper dar, welcher u.A. auf MSDN-Library durchsuchenSysAllocString weiterleitet. Dafür ist das praktisch in jeder Sprache verfügbar.

String ist ein compilerabhängiger "Alias" und geht auf AnsiString (D2 bis D2007), UnicodeString (seit D2009) und ShortString (D1, wobei es dort nur diesen String gab und es noch keine Alias war)

intern ist es ein aufgemotztes "dynamisches Array"
  • in Windows mit Offset von 1 -> Index 0 = Char 1, wegen Abwärtskompatibilität zum alten ShortString
  • Pointer zeigt auf erstes Zeichen, hinten gibt es noch zwei implizite #0
  • vor dem ersten Zeichen liegen die Integer Länge und Referenzzählung
  • und seit D2009 nochmal davor zwei Word für CodePage und CharSize
  • im Gegensatz zu den normalen dyn. Arrays funktioniert hier auch das CopyOnWrite (Bei Schreibzugriffen auf einzelne Zeichen, mit einem RefCount größer 1, wird eine Kopie angelegt und damit gearbeitet)
  • Konstanten haben einen RefCount von -1


PS: Schaut mal in die OH ... dort tut wirklich manchmal jemand was und man hat den String-Aufbau dort nun auch endlich mal dokumentiert.

Zitat:

außer bei nextgen
Ich bin mir nicht ganz sicher wer, aber entweder im Nextgen oder im Windows kann man per Compilerschalter das Verhalten umstellen.

Delphi-Referenz durchsuchenStringElementSize
Delphi-Referenz durchsuchenStringCodePage / Delphi-Referenz durchsuchenSetCodePage
Delphi-Referenz durchsuchenStringRefCount / Delphi-Referenz durchsuchenUniqueString


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:18 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