Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   AnsiString zu String und umgekehrt (https://www.delphipraxis.net/180300-ansistring-zu-string-und-umgekehrt.html)

DangerDistel 8. Mai 2014 20:42

AnsiString zu String und umgekehrt
 
Hallo Leute,

ich habe nur kurz eine Frage und zwar die Umwandlung von AnsiStrings zu Strings und umgekehrt.

es kommt bei Delphi ja die Meldung "Implizite String-Umwandlung von 'AnsiString' zu 'string'"

ich habe mir folgende Routine gedacht

Delphi-Quellcode:
  Function ChangeAnsiStringToString(S:AnsiString):String;
  begin
    Result:=EmptyStr;
    if S <> EmptyAnsiStr then
    begin
      Result:= String(S);
    end;
  end;
kann mir dann diese Routine sozusagen in die Suppe spucken oder macht diese dann eher keine Probleme?

himitsu 8. Mai 2014 22:00

AW: AnsiString zu String und umgekehrt
 
Sorum sollte es keine Probleme geben.

Delphi-Quellcode:
  Function ChangeAnsiStringToString(const S: AnsiString): String; inline;
  begin
    Result := String(S);
  end;
Ob nun implizit (
Delphi-Quellcode:
S := A;
) oder explizit (
Delphi-Quellcode:
S := string(A);
),
am Ende kommt das Selbe bei raus, nur daß beim Expliziten der Compiler nicht meckert, weil man ihm damit sagt, daß es Absicht ist.

Intern wird einfach nur MSDN-Library durchsuchenMultiByteToWideChar mit CP_ACP gemacht.


PS: Man könnte solche Compilermeldungen auch "einfach" deaktiveren.

DeddyH 8. Mai 2014 22:08

AW: AnsiString zu String und umgekehrt
 
Jo, 1Byte passt immer in einen 2-Byte-Typ, aber nicht anders herum.

himitsu 8. Mai 2014 22:41

AW: AnsiString zu String und umgekehrt
 
Immer nicht unbedingt.

ANSI ist ja MultiByte ... Einheiten zu einem Byte, aber mehrere Bytes kombinierbar, was vorallem die Asiaten ausnutzen, oder z.B. auch das UTF-8

Ins UCS2 würde es also nicht immer passen, da dessen Umfang beschränkter ist, als beim UTF-8, aber beim UTF-16 ('ner Art Erweiterung des UCS2) sieht es wieder anders aus, auch wenn das UTF-16 strukturmäßig mit UFT-8 nix zu tun hat, genauso wie das UTF-7 auch nicht.

mkinzler 9. Mai 2014 06:33

AW: AnsiString zu String und umgekehrt
 
Zitat:

ANSI ist ja MultiByte ... Einheiten zu einem Byte, aber mehrere Bytes kombinierbar, was vorallem die Asiaten ausnutzen, oder z.B. auch das UTF-8
An sich ist Ansi nicht Multibyte. ANSI ist um ein Bit erweitertes ASCII (7 Bit). Natürlich kann man Ansi auch missbrauchen und etwas anderes reinschreiben. Für UTF8 würde ich aber WideString verwenden und kein AnsiString.

DangerDistel 9. Mai 2014 07:00

AW: AnsiString zu String und umgekehrt
 
Vielen Danke erstmal für die schnelle Info :-)

Bernhard Geyer 9. Mai 2014 07:20

AW: AnsiString zu String und umgekehrt
 
Zitat:

Zitat von mkinzler (Beitrag 1258358)
An sich ist Ansi nicht Multibyte. ANSI ist um ein Bit erweitertes ASCII (7 Bit). Natürlich kann man Ansi auch missbrauchen und etwas anderes reinschreiben. Für UTF8 würde ich aber WideString verwenden und kein AnsiString.

Widestrings ist aber keine UTF8 sondern UTF16. UnicodeString kann UTF8

Patito 9. Mai 2014 07:55

AW: AnsiString zu String und umgekehrt
 
Zitat:

Zitat von mkinzler (Beitrag 1258358)
Zitat:

ANSI ist ja MultiByte ... Einheiten zu einem Byte, aber mehrere Bytes kombinierbar, was vorallem die Asiaten ausnutzen, oder z.B. auch das UTF-8
An sich ist Ansi nicht Multibyte. ANSI ist um ein Bit erweitertes ASCII (7 Bit). Natürlich kann man Ansi auch missbrauchen und etwas anderes reinschreiben. Für UTF8 würde ich aber WideString verwenden und kein AnsiString.

Naja. UTF-8 ist Ansi mit Codepage 65001. Und z.B. die Codepage für chinesisches Ansi ist auf jeden Fall Multibyte...
Und UTF8 passt nun wirklich überhaupt nicht in einen WideString. Ein UTF-8 Charakter kann eine ungerade Anzahl Bytes haben, und das passt überhaupt nicht zu einem WideString.

Sherlock 9. Mai 2014 08:59

AW: AnsiString zu String und umgekehrt
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1258364)
Zitat:

Zitat von mkinzler (Beitrag 1258358)
An sich ist Ansi nicht Multibyte. ANSI ist um ein Bit erweitertes ASCII (7 Bit). Natürlich kann man Ansi auch missbrauchen und etwas anderes reinschreiben. Für UTF8 würde ich aber WideString verwenden und kein AnsiString.

Widestrings ist aber keine UTF8 sondern UTF16. UnicodeString kann UTF8

Ja, in die WideString Falle bin ich auch getappt. WideString ist ja nicht der derzeitige Delphi-String sondern eben UnicodeString. Da kann bei einer (impliziten) Typumwandlung übrigens etwas verloren gehen. Und Warnungen oder Hinweise dazu kommen keine. Unschön.

Sherlock

mkinzler 9. Mai 2014 09:04

AW: AnsiString zu String und umgekehrt
 
WideString ist ein nicht von der Delphi RTL verwalteter Typ. Um den Inhalt muss sich das Programm kümmern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:30 Uhr.
Seite 1 von 2  1 2      

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