AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language AnsiString zu String zuweisen ohne Konvertierung?
Thema durchsuchen
Ansicht
Themen-Optionen

AnsiString zu String zuweisen ohne Konvertierung?

Ein Thema von Rolf Frei · begonnen am 7. Dez 2019 · letzter Beitrag vom 10. Dez 2019
Antwort Antwort
Rolf Frei

Registriert seit: 19. Jun 2006
655 Beiträge
 
Delphi 11 Alexandria
 
#1

AnsiString zu String zuweisen ohne Konvertierung?

  Alt 7. Dez 2019, 12:25
Delphi-Version: 10.3 Rio
Wie kann ich in 10.3 Rio einen AnsiString einem String zuweisen, ohne dass der String über die Codepage konvertiert wird? Siehe folgendes Beispiel:

Delphi-Quellcode:
var
  a: AnsiString;
  s: String;
begin
  a := #$33#$95#$34;
  s := a;
end;
Nach der Zuweisung s := a hat s die Zeichenwerte #$0033 #$2022 #$0034. Ich müsste nun aber anstatt #$2022 den Wert #$0095 haben. Wie kann ich das bewerkstelligen, dass da bei der Zuweisung keine Codepagekonvertierung stattfindet? Auch die {$HIGHCHARUNICODE OFF} Direktive bringt keine Lösung.

Geändert von Rolf Frei ( 7. Dez 2019 um 12:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: AnsiString zu String zuweisen ohne Konvertierung?

  Alt 7. Dez 2019, 13:36
Ich kann dir keine direkte Lösung sagen, aber die Suche auf Google Bei Google suchendelphi ansistring to string ergibt etliche Teffer. Vielleicht findest du da schnell eine Lösung
Michael Kübler
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
655 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: AnsiString zu String zuweisen ohne Konvertierung?

  Alt 7. Dez 2019, 13:56
Habe schon Stunden lange gesucht und zu dem was ich hier suche finde ich nichts.

Das nächste Problem steht auch schon an: TIniFile/TMemeIniFile. Delphi liest hier nun Unicodestrings obwohl ein INI-File immer Ansi-Daten enthält. Nun habe ich da wieder das selbe Problem, dass ich da nun in Unicode umgewandelte Strings geliefert bekomme, die Zeichenwerte > 255 enhalten. Die Daten im INI sind aber als ANSI gespeichert und ich muss diese auch wieder in der selben Art lesen können, also nur mit Zeichewerten <=255. Ist im Prinzip genau ds selbe Problem, dass da beim Einlesen eine Konvertierung in Unicode passiert, was nicht sein darf! Ich brauche da die Ansi Strings so wie sie in Delphi 7 gespeichert wurden. Gibt es irgendwo ein Ansi kompatibles TIniFile?

Geändert von Rolf Frei ( 7. Dez 2019 um 13:58 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: AnsiString zu String zuweisen ohne Konvertierung?

  Alt 7. Dez 2019, 16:30
Hallo,
schau mal hier, Stichwort Encoding
http://docs.embarcadero.com/products...TEncoding.html
Heiko
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.029 Beiträge
 
Delphi 12 Athens
 
#5

AW: AnsiString zu String zuweisen ohne Konvertierung?

  Alt 7. Dez 2019, 16:47
Eventl. statt AnsiString RawByteString benutzen, der "hat keine Codepage".

Grüße

TurboMagic
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
655 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: AnsiString zu String zuweisen ohne Konvertierung?

  Alt 7. Dez 2019, 16:49
Das ist mir alles bekannt nützt mir hier nur nichts oder ich verstehe nicht wie man das richtig anwendet. Man müsste ja beim Unicodestring "s" sagen, dass er nichts umwandeln soll. Hast du mir eventuell ien Beispal anhandn meins Beispiels? Bei meinen Tests kam da nie das gewünschte heraus, wenn ich mit Tencoder herumgespielt habe.

Wenn ich "a" and "s" nicht direkt zuweise, sondern sowas hier mache..

Delphi-Quellcode:
  
  for i := 1 to Length(a) do
    s := s + Char(Ord(a[i]));
... bekomme ich das was ich will, aber das kann nicht der richtige Weg sein.

@TurboMagic
Das habe ich auch schon versucht macht aber keinen Unterschied. S hat danach immer den Unicodewert (2022) aus dem ANSI Zeichen 95 erhalten. Auch eine SetCodepage hat keinen Unterschied gemacht. Es müsste ja der Varibale S mitgetielt werden, das sie keine Uniccodekonvertierung machen soll. Das Encoding ist ja eher für das umgekehrte vom String in ein Ansi.

Geändert von Rolf Frei ( 7. Dez 2019 um 16:55 Uhr)
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
491 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: AnsiString zu String zuweisen ohne Konvertierung?

  Alt 7. Dez 2019, 19:20
Mit String bzw. UnicodeString geht das so leider nicht, weil hier eine Konvertierung IMMER automatisch stattfindet (Deshalb sind String -Objekte auf der Linken Seite auch immer ReadOnly).
Das ist wegen der Referenzzählung notwendig, damit du keine Speicherlöcher bekommst. Allerdings gibt es hier ein paar möglichkeiten, das zu umgehen.
Der einfachste Weg wäre es, Statt String bzw. UnicodeString einen anderen Typ für die Zuweisung zu verwenden.
Ich würde einen Zeigertypen wie PAnsiChar oder alternativ PByte empfehlen.

Delphi-Quellcode:
var
  a: AnsiString;
  s: String;
begin
  a := #$95;
// s := a;
  PAnsiChar(s) := PAnsiChar(a);
  ShowMessage((Ord(s[1]).ToHexString)); // Gibt $95 zurück
Allerdings bekommst du so für das zweite, dritte, vierte, ... Zeichen der Zeichenkette nur Salat heraus, da die Zeichen ja andere Bytegrößen haben. Das kannst du durch eine einfache Zuweisung nicht beheben, da du jedes Zeichen auf Unicode erweitern musst.

KLEINE ERGÄNZUNG: So könntest du es Implementieren, falls du die Werte Kopieren willst:
Delphi-Quellcode:
var
  a: AnsiString;
  s: String;
  pa: PAnsiChar;
  ps: PChar;
begin
  a := #$95#22;
  SetLength(s, length(a));
  pa := PAnsiChar(a);
  ps := PChar(s);
  while pa^ <> #0 do
  begin
    PAnsiChar(ps)^ := pa^;
    Inc(pa);
    Inc(ps);
  end;
  ShowMessage((Ord(s[2]).ToHexString)); // Gibt $16 zurück
end;
Dennis

Geändert von Dennis07 ( 7. Dez 2019 um 19:32 Uhr)
  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 11:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz