![]() |
UTF8/Unicode/Ansicode Konvertierungen!
Hallo Zusammen!
Ich steh irgendwie gerade auf dem Schlauch... :stupid: Die Routine
Delphi-Quellcode:
Schreib die Zeichen so in die Datei wie sie auf dem Bildschirm stehen...
var
F : Textfile; S : WideString; begin Assignfile(F,'Foo.Dat'); Rewrite(F); S := 'üöäßé•©'; Writeln(F,S); Closefile(F) end; Als "1Byte" Strings. Textedit XY schreib die gleiche Zeichenfolge als(üöäÃYéâ_¢Â©) auf die Platte.. UTF8?? Also beim einlesen
Delphi-Quellcode:
1. Wieso Datenverlust? Wie wäre es richtig?
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 2. Wie kann ich, nachdem ich mit A gearbeitet habe den String wieder wegschreiben sodas Editor XY den wieder lesen kann? Mavarik |
AW: UTF8/Unicode/Ansicode Konvertierungen!
Schau mal hier:
![]() Man kann eine Codepage als optionalen Parameter angeben. Ansonsten nicht mehr das alte AssignFile verwenden. Alternativ TStreamWriter. Was ist "Textedit XY" |
AW: UTF8/Unicode/Ansicode Konvertierungen!
Zitat:
OK
Delphi-Quellcode:
Funktioniert jetzt wie "erwartet"!
var
F : Textfile; S : WideString; begin Assignfile(F,'Foo.dat',cp_UTF8); Rewrite(F); S := 'üöäßé•©'; Writeln(F,S); Closefile(F) end; aber
Delphi-Quellcode:
Doppeltgemoppelt?
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; 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 "�" |
AW: UTF8/Unicode/Ansicode Konvertierungen!
Hat die HTML-Seite den BOM-Code.
mal mit einem HEX-Editor schauen. |
AW: UTF8/Unicode/Ansicode Konvertierungen!
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.) |
AW: UTF8/Unicode/Ansicode Konvertierungen!
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
Delphi-Quellcode:
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 :stupid:
UTF8ToString
(Bei den beliebten Anglizismen müsste das sogar funktionieren :D) |
AW: UTF8/Unicode/Ansicode Konvertierungen!
HTML muß kein BOM haben (hat es meistens auch nicht), denn dort wird die Kodierung über ein Meta-Tag geregelt.
|
AW: UTF8/Unicode/Ansicode Konvertierungen!
Zitat:
|
AW: UTF8/Unicode/Ansicode Konvertierungen!
Zitat:
Zitat:
Delphi-Quellcode:
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.
Utf8ToString
|
AW: UTF8/Unicode/Ansicode Konvertierungen!
Zitat:
Die HTML Componente kann das komischerweise nicht... Ich teste noch... |
AW: UTF8/Unicode/Ansicode Konvertierungen!
Zitat:
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:
Delphi-Quellcode:
Sollte aber
if t.CodePage = 0 then TryOpenForOutput(t);
Delphi-Quellcode:
sein. Man vergleiche dazu die Fundstellen von "TryOpenForInput".
if t.Mode <> fmOutput then
Ist das im aktuellen D10 noch immer so? Falls ja, wer macht den Bugreport? |
AW: UTF8/Unicode/Ansicode Konvertierungen!
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:09 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-2025 by Thomas Breitkreuz