Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   WideString zu AnsiString konvertieren (https://www.delphipraxis.net/158362-widestring-zu-ansistring-konvertieren.html)

Shark99 14. Feb 2011 18:00

WideString zu AnsiString konvertieren
 
Ich hab einen WideString, der nur englischen Text erhält und würde ihn gerne zu AnsiString konvertieren.

Versucht habe ich es mit einer Jedi funktion:

function UTF16ToCodepage(s: WideString): string;
begin
Result := WideStringToStringEx(s, GetACP());
end;

Als Ergebnis kommt jedoch sowas in der Art raus (evaluate Ausgabe):

'e'#0'm'#0' '#0'w'#0'i'#0't'#0'

WM_CLOSE 14. Feb 2011 18:03

AW: WideString zu AnsiString konvertieren
 
Bei mir (D2009) funktioniert das mit einer expliziten Umwandlung:
Delphi-Quellcode:
String(MeinAnsiString)
mit welcher Version arbeitest du?
Kannst du das vielleicht in dein Profil aufnehmen?

himitsu 14. Feb 2011 18:04

AW: WideString zu AnsiString konvertieren
 
Wenn es sich um Delphi handelt und da du eh nur nach ACP kodieren willst:
Delphi-Quellcode:
function UTF16ToCodepage(s: WideString): string;
begin
  Result := s; //Result := AnsiString(s);
end;
Also, selbst mit einer impliziten Umwandlung sollte es gehn, auch wenn da der Compiler eventuell mit einer Warnung wirft.

Wenn das nicht geht, dann liegt der Fehler wohl in dem String, welchen du als Parameter reinbekommst.


PS: Wenn du unbedingt nach ANSI kodieren mußt, dann statt
Delphi-Quellcode:
string
lieber ein
Delphi-Quellcode:
AnsiString
verwenden, denn ab Delphi 2009 wird der String kein AnsiString mehr sein.

Shark99 14. Feb 2011 18:33

AW: WideString zu AnsiString konvertieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich verwende Delphi 7 mit der neuesten Jedi version.

Die Beispiel-TextDatei ist angehängt.

Ich lade sie so:
Delphi-Quellcode:
ws := TWideStringList.Create;
ws.LoadFromFile(FileName);
Evaluate von ws.Text gibt dies aus (alles korrekt):

'GStreamer Codec and Totem Movie Player for Linux'#$D#$A

Wenn ich nun diese Umwandlung mache:
Delphi-Quellcode:
function UTF16ToCodepage(s: WideString): string;
begin
  Result := s;
end;

...

var
s: string;
begin
...

s := UTF16ToCodepage(ws.Text);
gibt Evaluate von s dies aus:

'ÿþG'#0'S'#0't'#0'r'#0'e'#0'a'#0'm'#0'e'#0'r'#0' '#0'C'#0'o'#0'd'#0'e'#0'c'#0' '#0'a'#0'n'#0'd'#0' '#0'T'#0'o'#0't'#0'e'#0'm'#0' '#0'M'#0'o'#0'v'#0'i'#0'e'#0' '#0'P'#0'l'#0'a'#0'y'#0'e'#0'r'#0' '#0'f'#0'o'#0'r'#0' '#0'L'#0'i'#0'n'#0'u'#0'x'#0#$D#0#$A#0#$D#0#$A#0

String(s) liefert das gleiche Ergebnis.

himitsu 14. Feb 2011 22:19

AW: WideString zu AnsiString konvertieren
 
Zitat:

gibt Evaluate von s dies aus:
Von welchem S?

Das externe?
Wenn ja, dann schau mal nach, was das S in der Funktion sagt.

Wenn es das Selbe sagt, dann ist die TWideStringList fehlerhaft.

Shark99 14. Feb 2011 23:09

AW: WideString zu AnsiString konvertieren
 
function UTF16ToCodepage(s: WideString): string;
begin
Result := s;
end;

Evaluate von s (WideString) innerhalb der Funktion ergibt:

'GStreamer Codec and Totem Movie Player for Linux'#$D#$A

Evaluate von s (String) NACH der Funktion ergibt:

'ÿþG'#0'S'#0't'#0'r'#0'e'#0'a'#0'm'#0'e'#0'r'#0' '#0'C'#0'o'#0'd'#0'e'#0'c'#0' '#0'a'#0'n'#0'd'#0' '#0'T'#0'o'#0't'#0'e'#0'm'#0' '#0'M'#0'o'#0'v'#0'i'#0'e'#0' '#0'P'#0'l'#0'a'#0'y'#0'e'#0'r'#0' '#0'f'#0'o'#0'r'#0' '#0'L'#0'i'#0'n'#0'u'#0'x'#0#$D#0#$A#0#$D#0#$A#0

himitsu 14. Feb 2011 23:45

AW: WideString zu AnsiString konvertieren
 
Sehr interessant. :shock:

jedenfalls hatte ich damals in meinem D7 solche Probleme nicht.


Geht es hiermit?
Delphi-Quellcode:
function UTF16ToCodepage(S: WideString): AnsiString;
var
  i: Integer;
begin
  if S <> '' then
  begin
    i := WideCharToMultiByte(CP_ACP, 0, PWideChar(S), Length(S),
      nil, 0, nil, nil);
    SetLength(Result, i);
    WideCharToMultiByte(CP_ACP, 0, PWideChar(S), Length(S),
      PAnsiChar(Result), i, nil, nil);
  end else
    Result := '';
end;
Delphi-Quellcode:
'GStreamer Codec and Totem Movie Player for Linux'#$D#$A

Evaluate von s (String) NACH der Funktion ergibt:

'ÿþG'#0'S'#0't'#0'r'#0'e'#0'a'#0'm'#0'e'#0'r'#0' '#0'C'#0'o'#0'd'#0'e'#0'c'#0' '#0'a'#0'n'#0'd'#0' '#0'T'#0'o'#0't'#0'e'#0'm'#0' '#0'M'#0'o'#0'v'#0'i'#0'e'#0' '#0'P'#0'l'#0'a'#0'y'#0'e'#0'r'#0' '#0'f'#0'o'#0'r'#0' '#0'L'#0'i'#0'n'#0'u'#0'x'#0#$D#0#$A#0#$D#0#$A#0
Ich wußte garnicht daß Delphi bei einer Stringkonvertierung das BOM (FE FF) entfernt, jedenfalls sollte danach am Anfang des Strings ein "?" stehen. :shock:

Shark99 15. Feb 2011 00:21

AW: WideString zu AnsiString konvertieren
 
Damit klappt es, Danke!

Zitat:

Zitat von himitsu (Beitrag 1081749)
Sehr interessant. :shock:
Ich wußte garnicht daß Delphi bei einer Stringkonvertierung das BOM (FE FF) entfernt, jedenfalls sollte danach am Anfang des Strings ein "?" stehen. :shock:

Ich denke mal FF FE wurde nicht entfernt, sondern zu ÿþ gewandelt.

himitsu 15. Feb 2011 00:55

AW: WideString zu AnsiString konvertieren
 
Ohh, stimmt, da hab'sch falschrum geguckt. :oops:
Jedenfalls is dieses beim 'GStr...' nicht zu sehn (aber was sollte man von einem 0-breitem Leerzeichen erwarten :lol: , obwohl viele Browser dieses eben doch darstellen, so als "unbekanntes" Zeichen)


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