AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi UTF8/Unicode/Ansicode Konvertierungen!
Thema durchsuchen
Ansicht
Themen-Optionen

UTF8/Unicode/Ansicode Konvertierungen!

Ein Thema von Mavarik · begonnen am 4. Jan 2016 · letzter Beitrag vom 5. Jan 2016
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.153 Beiträge
 
Delphi 10.3 Rio
 
#1

UTF8/Unicode/Ansicode Konvertierungen!

  Alt 4. Jan 2016, 14:03
Hallo Zusammen!

Ich steh irgendwie gerade auf dem Schlauch...

Die Routine

Delphi-Quellcode:
var
  F : Textfile;
  S : WideString;
begin
  Assignfile(F,'Foo.Dat');
  Rewrite(F);
  S := 'üöäßé•©';
  Writeln(F,S);
  Closefile(F)
end;
Schreib die Zeichen so in die Datei wie sie auf dem Bildschirm stehen...
Als "1Byte" Strings.

Textedit XY schreib die gleiche Zeichenfolge als(üöäÃYéâ_¢Â©) auf die Platte.. UTF8??

Also beim einlesen

Delphi-Quellcode:
var
  F : Textfile;
  S : WideString;
  A : String;
begin
  Assignfile(F,'Foo.dat');
  Reset(F);
  Readln(F,S); // in S steht üöäÃYéâ_¢Â© Length(15)=15
  A := UTF8ToString(S); // potenzieller Datenverlust
  Closefile(F)
end
1. Wieso Datenverlust? Wie wäre es richtig?
2. Wie kann ich, nachdem ich mit A gearbeitet habe den String wieder wegschreiben sodas Editor XY den wieder lesen kann?

Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.305 Beiträge
 
Delphi 12 Athens
 
#2

AW: UTF8/Unicode/Ansicode Konvertierungen!

  Alt 4. Jan 2016, 14:24
Schau mal hier:

http://stackoverflow.com/questions/1...nd-delphi-2009

Man kann eine Codepage als optionalen Parameter angeben.

Ansonsten nicht mehr das alte AssignFile verwenden.

Alternativ TStreamWriter.

Was ist "Textedit XY"
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de

Geändert von bernau ( 4. Jan 2016 um 14:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.153 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: UTF8/Unicode/Ansicode Konvertierungen!

  Alt 4. Jan 2016, 15:14
Schau mal hier:
Man kann eine Codepage als optionalen Parameter angeben.

OK

Delphi-Quellcode:
var
  F : Textfile;
  S : WideString;
begin
  Assignfile(F,'Foo.dat',cp_UTF8);
  Rewrite(F);
  S := 'üöäßé•©';
  Writeln(F,S);
  Closefile(F)
end;
Funktioniert jetzt wie "erwartet"!

aber

Delphi-Quellcode:
var
  F : Textfile;
  S : WideString;
  A : String;
begin
  Assignfile(F,'Foo.dat',cp_UTF8);
  Reset(F);
  Readln(F,S); // S ist jetzt wie erwartet
  A := UTF8ToString(S); // A ist jetzt A '����镩'
  Closefile(F)
end;
Doppeltgemoppelt?

Editor: Ich habe eine UTF8 HTML Seite die ich in einen Memo(Code) bearbeiten will um dann wieder html daraus zu machen...
Aber entwerder habe ich im HTML ein "?" oder ein "�"

Geändert von Mavarik ( 4. Jan 2016 um 15:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.305 Beiträge
 
Delphi 12 Athens
 
#4

AW: UTF8/Unicode/Ansicode Konvertierungen!

  Alt 4. Jan 2016, 15:34
Hat die HTML-Seite den BOM-Code.

mal mit einem HEX-Editor schauen.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.305 Beiträge
 
Delphi 12 Athens
 
#5

AW: UTF8/Unicode/Ansicode Konvertierungen!

  Alt 4. Jan 2016, 15:38
Wiso eigendlich "UTF8ToString"

Wenn du das Textfile mit cp_UTF8 öffnest, dann müsste beim Lesen in der Variablen S doch schon das korrekt decodierte Zeichen stehen. (Nicht getestet. Nur so ne Idee.)
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: UTF8/Unicode/Ansicode Konvertierungen!

  Alt 4. Jan 2016, 15:46
Wenn man das Encoding mit angibt, dann weiß Delphi, wie es die Strings vom intern verwendeten Unicode (UTF16) beim Speichern codieren soll. In der Datei befindet sich dann der Text im angegebenen Encoding.

Beim Lesen funktioniert das genau umgekehrt (vom xy Encoding nach Unicode UTF16).

Ein zusätzliches UTF8ToString hat dann die gleichen Auswirkungen, wie wenn man einen Text von deutsch nach englisch übersetzt und das Ergebnis versucht wieder von deutsch nach englisch zu übersetzen

(Bei den beliebten Anglizismen müsste das sogar funktionieren )
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: UTF8/Unicode/Ansicode Konvertierungen!

  Alt 4. Jan 2016, 15:46
HTML muß kein BOM haben (hat es meistens auch nicht), denn dort wird die Kodierung über ein Meta-Tag geregelt.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#8

AW: UTF8/Unicode/Ansicode Konvertierungen!

  Alt 4. Jan 2016, 18:44
Man kann eine Codepage als optionalen Parameter angeben.

Ansonsten nicht mehr das alte AssignFile verwenden.
Es gibt auch System.GetTextCodePage und System.SetTextCodePage. Sind aber nur primitive Wrapper für einen Typecast: TTextRec(T).CodePage.

Dass man modernere Methoden für den Dateizugriff verwenden sollte, ist klar. Aber wie sieht es mit Konsolenanwendungen aus?
Da benutze ich noch immer das gute, alte Writeln.

Ein bisschen Off-topic:

Die alten Pascal-Dateifunktionen sind ja seit einiger Zeit Unicodetauglich und Codepage-aware. Das finde ich prinzipiell gut. Allerdings gefällt mir die Implementierung nicht so ganz. Ich habe mich vor einer Weile mal näher damit beschäftigt und festgestellt, dass etliche der _WriteXxx Prozeduren das TTextRec.CodePage Feld missbrauchen, um festzustellen ob die Datei bereits geöffnet wurde. Dafür müsste aber meiner Meinung nach das Feld TTextRec.Mode verwendet werden.
Man suche in System.pas nach "TryOpenForOutput", dann findet man mehrere Male sowas:

if t.CodePage = 0 then TryOpenForOutput(t); Sollte aber if t.Mode <> fmOutput then sein. Man vergleiche dazu die Fundstellen von "TryOpenForInput".

Ist das im aktuellen D10 noch immer so? Falls ja, wer macht den Bugreport?

Geändert von SMO ( 4. Jan 2016 um 18:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: UTF8/Unicode/Ansicode Konvertierungen!

  Alt 5. Jan 2016, 11:15
Für Console gibt es entweder nette Componenten, die den Zugriff besser regeln und auch weitere Funktionen bieten, wie z.B. Farben und Cursorposition zu ändern.
Und SetFileApisToANSI oder SetFileApisToOEM.

Ansonsten kann man auch auf StdIn und StdOut mit modernen Dateifunktionen zugreifen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.609 Beiträge
 
Delphi 12 Athens
 
#10

AW: UTF8/Unicode/Ansicode Konvertierungen!

  Alt 4. Jan 2016, 16:02
1. Wieso Datenverlust?
Die Warnung gibt dir eigentlich schon alle notwendigen Informationen:

Zitat:
W1058 Implizite String-Umwandlung mit potenziellem Datenverlust von 'WideString' zu 'RawByteString'
Utf8ToString erwartet einen RawByteString (also einen Byte-String ohne CodePage-Information), bekommt aber einen WideString. Mangels besserer Information macht der Compiler dort aus dem WideString einen AnsiString mit der aktuellen CodePage und gibt diesen als RawByteString an die Funktion. Diese erwartet aber (Hint: Funktionsname) eine UTF-codierten Byte-Sequenz. Das Ergebnis sieht dann in vielen Fällen eher bescheiden aus.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 10:05 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