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
mensch72

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

AW: Mal wieder Kodierungsprobleme. ANSI UTF8

  Alt 17. Nov 2017, 22:23
gaaaanz einfach, nix mit Ableitungen... nur einfach selbst VORHER "erkennen" ob UTF8 oder Ansi

Delphi-Quellcode:
ms:TMemoryStream
s:string;

ms:=TMemoryStream.Create;
ms.LoadFromFile('filename');

if IsUTF8(ms) then
  s := DecodeUTF8toString(ms)
else
  s := DecodeANSItoString(ms);
ms.free;
 
Memo1.Text:=s;
MemIniFile.Text:=s;
Du musst dir nur fix selbst(wie empfohlen) oder per "Try" mit TEncoding folgende 3 Funktionen basteln
Delphi-Quellcode:
function IsUTF8(const stream:TStream):Boolean;
function DecodeUTF8toString(const stream:TStream):string;
function DecodeANSItoString(const stream:TStream):string;

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

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

AW: Mal wieder Kodierungsprobleme. ANSI UTF8

  Alt 17. Nov 2017, 22:25
Da ich eine universelle Lösung brauche für das Laden von Textdateien UND das Laden/Speichern von Ini-Dateien, kann ich das leider nicht gebrauchen.
Ich belasse von nun an aber alles so wie ich es aktuell habe, da es funktioniert.

Dieser ganze Encoding-Kram ist doch der Wahnsinn!
  Mit Zitat antworten Zitat
mensch72

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

AW: Mal wieder Kodierungsprobleme. ANSI UTF8

  Alt 17. Nov 2017, 22:32
..."Da ich eine universelle Lösung brauche für das Laden von Textdateien UND das Laden/Speichern von Ini-Dateien, kann ich das leider nicht gebrauchen."...

Jedem das seine, die paar da geschrieben Code Zeilen ergeben genau DIE UNIVERSELLE Lösung, die man sogar noch per einem weiterem IF auf zusätzlich UTF16 erweitern kann... aber mach wie du willst, nur schimpfe nicht auf das Encoding-Konzept... das hat wirklich seinen Sinn
  Mit Zitat antworten Zitat
LTE5

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

AW: Mal wieder Kodierungsprobleme. ANSI UTF8

  Alt 17. Nov 2017, 22:33
Ich sehe keine Möglichkeit die oben genannten Codezeilen in eine Ini-Klasse einzubauen.
Da steht zwar "IsUTF8" aber davon habe ich ja eben keine Ahnung.
Zitat:
das hat wirklich seinen Sinn
Ich verstehe es nicht einmal und werde es auch nie verstehen. Code soll einfach nur funktionieren und das machen was man ihm sagt. Ich habe keine Lust mich mit 100 verschiedenen Encodings rumschlagen zu müssen.

Habe meine Version aus #1 bearbeitet, damit ich noch weniger Kopfschmerzen wegen diesem komischen Encodingkram habe
Delphi-Quellcode:
try
 sl.LoadFromStream(ResourceStream{*, TEncoding.UTF8*});
 {$WARNINGS OFF}
 Result := UTF8ToString(sl.Text);
 {$WARNINGS ON}
finally
 sl.Free;
end;

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

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

AW: Mal wieder Kodierungsprobleme. ANSI UTF8

  Alt 17. Nov 2017, 22:51
..."IsUTF8... Ich verstehe es nicht einmal und werde es auch nie verstehen. Code soll einfach nur funktionieren"...

=> UniCode und WideStrings sowie das "TEncoding" von Delphi sind eben NICHT perfekt, wenn es um in der Praxis durchaus übliche Files OHNE BOM geht... daher SCHREIBT MAN SICH DAS EBEN BESSER FIX SELBST, denn vom schimpfen oder verdrängen/ignorieren löst das Problem ja nicht, egal ob du dazu Lust hast oder nicht.

In #6 steht recht genau wie man diese Funktion sich selbst fix progammiert.... wenn du "später" zufällig doch mal hängst weil Delphi nun plötzlich bei abgeschalteter Warnung nun NICHT MEHR das macht was "du erwartest", sondern dann nun exakt das was du per Code gesagt hast... dann erkennst du eventuell den Vorteil von so scheinbar völlig unbedeutenten typsicheren Hilfsfunktionen
  Mit Zitat antworten Zitat
LTE5

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

AW: Mal wieder Kodierungsprobleme. ANSI UTF8

  Alt 17. Nov 2017, 23:00
Ich glaube greenmiles erster Satz aus Beitrag #20 spiegelt gerade meine Stimmung wieder

http://www.delphipraxis.net/180079-e...-fehler-3.html

Ich habe nicht mal Ahnung von Encodings. Denkst du wirklich ich habe Ahnung von dem was in #6 steht? Nee

ich bin ja nicht so, also hab ichs versucht. Ging nur leider in die hose. Egal welche Datei ich reinwerfe, es ist immer False.
Delphi-Quellcode:
 function IsUTF8(FileName: string): Boolean;
 var
  _FileStream: TFileStream;
  _Word: Word;
 begin
  _FileStream := TFileStream.Create(FileName, fmOpenRead);
  _FileStream.Read(_Word, SizeOf(_Word));

  try
   case _Word of
    $FEFF:
     Result := False; // UTF-16
    $FFFE:
     Result := False; // UTF-16
    $EFBB:
     Result := True; // UTF-8
   end;
  finally
   _FileStream.Free
  end;
 end;

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

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

AW: Mal wieder Kodierungsprobleme. ANSI UTF8

  Alt 17. Nov 2017, 23:26
Stimmungen und Gefühle beim programmieren vermeide ich, weil letztendlich macht die CPU ja doch nur was man ihr gesagt hat und nicht das was man will.
(Selbst Frauen sind da einfacher, die machen zwar selten das was man ihnen sagt, aber oft doch das was (M)man will )

Delphi-Quellcode:
function IsUTF8(const data:TStream):boolean;
var
  Value:BYTE;
begin
Result:=False;

data.Position:=0;
while(data.Position<>data.Length) do begin
  Value:=GetByteAndMovePos(data);
  if((Value and $c0)=$c0) and (data.Position<>data.Length) then begin
    Value:=GetByteAndMovePos(data);
    if((Value and $80)=$00) then exit;
  end;
end;

Result:=True;
end;
Wenn dir 5Minuten für so ein paar Zeilen basierend auf #6 zu anstrengend sind, dann investiere eben weiter ständig überall sonst deine Nerven...




ps:
Sichwort "Intel-Speicherformat":
$EFBB: // MSBLSB
Result := True; // UTF-8
$BBEF: // LSBMSB
Result := True; // UTF-8

..."Was ich nicht verstehe ist, warum Google nicht voll von solchen Problemen ist"...
weil die meisten es BYTEbyBYTE auswerten und nicht als WORD, was bei IntelCPUs eben "gedreht" ist... aber alles kein Problem wenn man etwas in HEX denkt

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

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

AW: Mal wieder Kodierungsprobleme. ANSI UTF8

  Alt 17. Nov 2017, 22:41
Da ich eine universelle Lösung brauche für das Laden von Textdateien UND das Laden/Speichern von Ini-Dateien, kann ich das leider nicht gebrauchen.
Ich belasse von nun an aber alles so wie ich es aktuell habe, da es funktioniert.

Dieser ganze Encoding-Kram ist doch der Wahnsinn!
Nichts für ungut, aber diese Einstellung halte ich für kurzsichtig. Solange Du die Dateiinhalte auf die ASCII-Zeichen beschränken kannst, mag das gehen. Sobald Du über diesen Tellerrand hinaus gehst, muß Du Dich entscheiden, welche Codierung für Dich, oder besser die Aufgabenstellung, die richtige ist. Solltest Du den Bereich der Lateinische Schrift verlassen (müssen) ist meiner Meinung nach Unicode/UTF16 die richtige Wahl.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  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, 22:43
Ich hätte absolut kein Problem damit alles nach Unicode umzustellen.
Aber alleine schon die Tatsache, dass es eine Fehlermeldung bei Angabe des TEncodings gibt, wenn die Datei dieses Encoding aber nicht hat lässt mich alles über Board werfen, da ich auf sowas keine Lust habe.

Unicode-Anwendungen scheinen aber nicht so populär zu sein.
Beispiel an Inno Setup.
http://www.jrsoftware.org/isdl.php

1,113,859 Downloads die normale Version, 197,053 die Unicode.

Geändert von LTE5 (17. Nov 2017 um 22:48 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 13:35 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