AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ANSI-String nach Unicode wandeln

Ein Thema von BlueStarHH · begonnen am 1. Feb 2010 · letzter Beitrag vom 1. Feb 2010
Antwort Antwort
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
848 Beiträge
 
Delphi 11 Alexandria
 
#1

ANSI-String nach Unicode wandeln

  Alt 1. Feb 2010, 17:50
Hallo ich habe einen ANSIString, der Unicode enthält und den ich in einen UnicodeString wandeln möchte (Delphi 2009). Wie mache ich das? Das Beispiel soll "Hallo" anzeigen, zeigt aber nichts da, wie man im Debugger sehen kann in AString noch immer eine #0 am Anfang steht (Stringende)

Delphi-Quellcode:
var
  AANSIString: AnsiString;
  AString: string;
begin
  AANSIString := #0'H'#0'a'#0'l'#0'l'#0'o';
  AString := AANSIString;
  ShowMessage(AString);
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: ANSI-String nach Unicode wandeln

  Alt 1. Feb 2010, 17:59
Und wer macht sowas in einen AnsiString?
Da wirst du jetzt mit Harten Casts arbeiten müssen bzw. Speicher-Copierroutinen Inhalt deines AnsiStrings -> Speicheradresse von Unicodstring der zuvor mit SetLength auf passende größe gebraucht wurde.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

Re: ANSI-String nach Unicode wandeln

  Alt 1. Feb 2010, 18:03
Ab D2009 hast du es eigentlich sehr einfach. Beispiel:
Delphi-Quellcode:
var
  A: AnsiString;
  U: String;
begin
  A := 'Hallo';
  // compiler Magic :)
  U := A;
  ShowMessage(U);
end;
In deinem Falle, müsstest du nur dafür sorgen, dass du die #0 vorher aus dem AnsiString entfernst.
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
848 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: ANSI-String nach Unicode wandeln

  Alt 1. Feb 2010, 18:07
Zitat von Bernhard Geyer:
Und wer macht sowas in einen AnsiString?
Da wirst du jetzt mit Harten Casts arbeiten müssen bzw. Speicher-Copierroutinen Inhalt deines AnsiStrings -> Speicheradresse von Unicodstring der zuvor mit SetLength auf passende größe gebraucht wurde.
Meinst Du mit harten Casts das hier:

AString := String(AANSIString); Das ändern auch nichts am Ergebnis.

Wäre es einfacher wenn man statt des AnsiStrings einen RawByteString hätte? Wie könnte man den in Unicode wandeln? Das Grundproblem ist folgendes: Ich habe eine ANSI-Datei die zeileweise eingelesen wird. In einer Zeile kann an einer beliebigen Stelle ein Unicode-String anfangen (bis zum Zeilenende). Das ist durch $FE$FF markiert. Daher dachte ich, dass es am einfachsten ist, diesen Teil einfach per Copy aus dem Ansi-String zu kopieren und in einen Unicode string zu wandel. Mit den ANSI-Inhalten davor werden noch ein paar Prüfungen angestellt, ob man den Unicodestring überhaupt braucht oder nicht.
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
848 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: ANSI-String nach Unicode wandeln

  Alt 1. Feb 2010, 18:09
Zitat von Zacherl:
Ab D2009 hast du es eigentlich sehr einfach. Beispiel:
Delphi-Quellcode:
var
  A: AnsiString;
  U: String;
begin
  A := 'Hallo';
  // compiler Magic :)
  U := A;
  ShowMessage(U);
end;
In deinem Falle, müsstest du nur dafür sorgen, dass du die #0 vorher aus dem AnsiString entfernst. Ich bin nicht sicher, aber es könnte reichen die 0 am Anfang zu entfernen, um sie ans Ende anzuhängen. (Dadurch müsstest du zwischen Little Endian und Big Endian Kodierung wechseln)
Nein das klappt nicht. Egal ob die Null nun am Anfang oder Ende ist. Wenn die Null am Anfang ist, wird nichts angezeigt. Wenn die Null am Ende ist wird nur das H angezeigt. Ich verwendet Delphi 2009.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

Re: ANSI-String nach Unicode wandeln

  Alt 1. Feb 2010, 18:13
Probiers mal so:
Delphi-Quellcode:
var
  A: AnsiString;
  U: String;
  I: Integer;
begin
  A := #0'H'#0'a'#0'l'#0'l'#0'o';
  SetLength(U, Length(A) div 2);
  for I := 1 to Length(A) do
  begin
    if (A[I] <> #0) then
      U[I div 2] := Char(A[I]);
  end;
  ShowMessage(U);
end;
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: ANSI-String nach Unicode wandeln

  Alt 1. Feb 2010, 18:17
Zitat von BlueStarHH:
Meinst Du mit harten Casts das hier:

AString := String(AANSIString);
Nee. Hier wird der Compiler eine "weiche" Wandlung durchführen. Du mußt eher nach PWidechar casten und die Compilerwarnungen ignorieren.

Zitat von BlueStarHH:
Ich habe eine ANSI-Datei die zeileweise eingelesen wird. In einer Zeile kann an einer beliebigen Stelle ein Unicode-String anfangen (bis zum Zeilenende). Das ist durch $FE$FF markiert.
Dann ist es keine ANSI-Datei mehr.

Lese die Datei mit TFileStream ein und wandle dann die eingelesenen Datenblöcke passend nach ANSI oder Unicodestring.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
848 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: ANSI-String nach Unicode wandeln

  Alt 1. Feb 2010, 18:18
Zitat von Zacherl:
Probiers mal so:
Delphi-Quellcode:
var
  A: AnsiString;
  U: String;
  I: Integer;
begin
  A := #0'H'#0'a'#0'l'#0'l'#0'o';
  SetLength(U, Length(A) div 2);
  for I := 1 to Length(A) do
  begin
    if (A[I] <> #0) then
      U[I div 2] := Char(A[I]);
  end;
  ShowMessage(U);
end;
In A kann ein beliebier Unicode string stehen. Es müssen dort keine Nullen stehen! Es kann dort z.B. auch auch #5 stehen.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: ANSI-String nach Unicode wandeln

  Alt 1. Feb 2010, 18:19
Zitat von BlueStarHH:
In A kann ein beliebier Unicode string stehen. Es müssen dort keine Nullen stehen! Es kann dort z.B. auch auch #5 stehen.
Vor allem dieser Code ist nicht €-Zeichen Kompatible (auch wenn nur Ansi-Character in den entsprechenden Unicode-Strings stehen würden).
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#10

Re: ANSI-String nach Unicode wandeln

  Alt 1. Feb 2010, 18:43
wie? selber kopieren ... fertiges gibt es hierfür nicht
Move / MoveMemory
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:37 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