AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Mal wieder Kodierungsprobleme. ANSI UTF8 UTF16
Thema durchsuchen
Ansicht
Themen-Optionen

Mal wieder Kodierungsprobleme. ANSI UTF8 UTF16

Ein Thema von LTE5 · begonnen am 17. Nov 2017 · letzter Beitrag vom 20. Nov 2017
Antwort Antwort
Seite 1 von 2  1 2      
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Mal wieder Kodierungsprobleme. ANSI UTF8 UTF16

  Alt 17. Nov 2017, 20:43
Erstellt wird eine Resource-Datei. Sie beinhaltet Textdokumente.
Ein paar davon sind UTF-8 ohne BOM und ein paar ANSI.

Lade ich die Resource nun mit den hier stehenden Fragmenten, dann kommt bei der UTF8-Datei das korrekte Ergebnis. Bei der ANSI-Datei kommt eine Fehlermeldung.

Muss ich jetzt alle UTF-8-Dateien nach ANSI kodieren, umgekehrt oder die Funktion anpassen? Ehrlich gesagt habe ich nicht mal eine Ahnung worin der Unterschied liegt.

Delphi-Quellcode:
 ResourceStream := TResourceStream.Create(Instance, ResourceName, RT_RCDATA);
 try
  sl := TStringList.Create;

  try
   sl.LoadFromStream(ResourceStream, TEncoding.UTF8);
   Result := sl.Text;
  finally
   sl.Free;
  end;

....

Geändert von LTE5 (18. Nov 2017 um 09:06 Uhr)
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.018 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Mal wieder Kodierungsprobleme. ANSI UTF8

  Alt 17. Nov 2017, 21:01
Du musst je nach Datei das korrekte Encoding angeben. Wenn du ANSI-Dateien als UTF-8 lädst, macht Delphi überhaupt nichts, weil das Encoding von Emba so definiert und deklariert wurde.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Mal wieder Kodierungsprobleme. ANSI UTF8

  Alt 17. Nov 2017, 21:02
Wie gehe ich das denn an, wenn ich das Encoding nicht kenne?

Ich habe gelesen, ANSI sei veraltet. Stimmt das? Man solle am besten direkt UTF8 nehmen.
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.018 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Mal wieder Kodierungsprobleme. ANSI UTF8

  Alt 17. Nov 2017, 21:10
ANSI ist nicht standardisiert und wird von der Locale bestimmt. Während alle westlichen PCs in der Regel dieselbe Locale haben (CP1252), wird sich das Programm auf Rechnern in anderen Regionen anders verhalten.

Das Encoding einer Textdatei kann ohne BOM nicht sicher herausgefunden werden. Ein klassischer Witz unter Windows XP war, eine Textdatei im Windowseditor zu erstellen und "Bill hid the facts" reinzuschreiben. Dann passierten lustige Dinge.
Firefox verhält sich bei ANSI beispielsweise abhängig von der TLD völlig unterschiedlich, obwohl ANSI CP1252 eindeutig als Standardzeichensatz von HTML5 definiert ist.

Aber zurück zum Thema: Alle Dateien sollten als UTF-8 gespeichert werden. Das verbraucht zwar mehr Speicherplatz, ist aber nötigt, denn bei Delphi kannst du die zu verwendende Locale nicht ohne weiteres angeben. Du kannst nur ANSI angeben (TEncoding.Default), aber das ist wie gesagt nicht standardisiert.
Janni
2005 PE, 2009 PA, XE2 PA

Geändert von Redeemer (17. Nov 2017 um 21:12 Uhr)
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: Mal wieder Kodierungsprobleme. ANSI UTF8

  Alt 17. Nov 2017, 21:14
Sollte man dementsprechend auch TMemIniFile.Create mit TEncoding.UTF8 aufrufen? Wenn die Datei schon existiert aber nicht im UTF8-Format, gibts eine schöne Fehlermeldung.

Und:

Memo LoadFromFile ... muss ich dort nun auch TEncoding.UTF8 angeben? Weil wenn die Datei zufälligerweise kein UTF8 ist, gibt es auch eine Fehlermeldung.

Geändert von LTE5 (17. Nov 2017 um 21:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Mal wieder Kodierungsprobleme. ANSI UTF8

  Alt 17. Nov 2017, 22:17
Ich habe gelesen, ANSI sei veraltet.
Es gibt Szenarien, in denen die Anwendung einer Ansi-Codierung nicht optimal ist.
In diesen Fällen ist die Anwendung von UTF8 oder UTF16 auf jeden Fall besser.

Wie gehe ich das denn an, wenn ich das Encoding nicht kenne?
Zunächst das Encoding heraus bekommen, und dann alle betroffenen Dateien auf das gleiche Encoding umstellen.
Welches Du verwendest, ist egal, aber es muß bei allen das selbe sein!

Gruß
K-H

Edith:
Muss man das überhaupt angeben? Speziell bei Ini-Dateien ist es komisch. Speichere ich eine frische Ini-Datei mit einer Section wo äöü vorkommt, wird es als ANSI gespeichert.
Speichere ich ohne Umlaute, Speichert Delphi es als UTF8.
Da die Umlaute den Unterschied zwischen ANSI und UTF8 ausmachen, stelle ich mir die Frage woran Du die UTF8-Codierung fest machst?
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (17. Nov 2017 um 22:24 Uhr)
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

AW: Mal wieder Kodierungsprobleme. ANSI UTF8

  Alt 17. Nov 2017, 22:22
Ich glaube ich bleibe bei meiner Ini-Ableitung definitiv bei der Zeile inherited Create(aFileName); ohne Encoding-Hexerei.
So gibt es keine Fehlermeldung. Wenn jemand meint eine Datei unbedingt selber bearbeiten zu müssen, ist es in diesem Falle das eigene Pech.

Ansonsten habe ich jetzt alle meine Dateien auf UTF8 ohne BOM umgestellt, da selbst Windows neue Dateien so anlegt.
Meinen Code aus Beitrag #1 habe ich unverändert so gelassen.

Da ich zu wenig Ahnung von dieser Hexerei habe, befasse ich mich damit nicht weiter und belasse alles so, wie es fehlerfrei funktioniert.
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#8

AW: Mal wieder Kodierungsprobleme. ANSI UTF8

  Alt 17. Nov 2017, 21:30
..."worin liegt der Unterschied"...

https://de.wikipedia.org/wiki/UTF-8

da steht viel Text, aber irgendwo in der Mitte steht, das "quasi" im UTF8 ByteArray nach einem HEX "11xxxxxx" stets mindestens ein weiteres Byte mit "10xxxxxx" folgen wird... und exakt das ist der Trick, wie man mit 98% Sicherheit sich selbst "ohne BOM" eine "IsUTF8" Funktion schreiben kann!
(Man geht davon aus, dass praktisch fast nie in Ansi-EU-Sprachen aufeinanderfolgend solche ZWEI Umlaute(>$80) verwendet, die zulällig mit diesen Bitmasken korrellieren. Die Leute die sich das ausgedacht haben, verwenden diese Bitmasken so definitiv nicht zufällig und waren sich des Erkennungsproblems ohne "BOM" sehr wohl bewußt)

- also lasse es weiter beim UTF8 auf eine Exeption ankommen und schalte damit dann auf deine "AnsiVariante" um, oder:
- programmiere dir selbst schnell eine Funktion, welche deinen Stream als BYTEbyBYTE durchgeht und bei einem HEX "11xxxxxx" nachschaut ob das nachfolgende Byte UNGLEICH "10xxxxxx"... wenn ja dann Break und Result=ANSI, sonst weiter bis zum Ende und dann Result=UTF8
- klar ist das nicht 100% eineindeutig, aber es hat sich in der Praxis so bewährt und wird von eingen so gemacht
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#9

AW: Mal wieder Kodierungsprobleme. ANSI UTF8

  Alt 17. Nov 2017, 21:33
Ist das hier auch annehmbar?

Delphi-Quellcode:
Memo1.Lines.LoadFromFile('file.txt');
Memo1.Text := UTF8ToString(Memo1.Text);
Das Problem mit der Ini-Datei besteht trotzdem noch. Wenn jemand auf die irrsinnige Idee kommt die Datei nach Ansi zu konvertieren, gibts natürlich ein Problem denn ich hab als Encoding UTF8 beim Create der Ini angegeben.

Und ob das hier eine Lösung ist weiß ich auch nicht
Delphi-Quellcode:
 try
  inherited Create(FileName, TEncoding.UTF8);
 except
  on E: EEncodingError do
   inherited Create(FileName);
 end;

Geändert von LTE5 (17. Nov 2017 um 21:36 Uhr)
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#10

AW: Mal wieder Kodierungsprobleme. ANSI UTF8

  Alt 17. Nov 2017, 21:45
Solange du nicht weißt, "was" es für Daten sind, vermeide in Delphi alles was mit Char oder String zu tun hat!
-> TBytes, TByteAarray oder ein TMemoryStream sind hier z.B. die passenden Speichertypen.

Dann kannst du es mit
Delphi-Quellcode:
try
  Memo1.Text := DecodeUTF8toString(MemoryStream);
except
  Memo1.Text := DecodeANSItoString(MemoryStream);
end;
oder
Delphi-Quellcode:
if IsUTF8(MemoryStream) then
  Memo1.Text := DecodeUTF8toString(MemoryStream)
else
  Memo1.Text := DecodeANSItoString(MemoryStream);
praktisch recht einfach realisieren.
  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 03:02 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