AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wie kann man TEncoding vergleichen?

Ein Thema von Codehunter · begonnen am 29. Aug 2017 · letzter Beitrag vom 30. Aug 2017
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

Wie kann man TEncoding vergleichen?

  Alt 29. Aug 2017, 15:02
Moin!

Ich steh grad irgendwie auf dem Schlauch:
Delphi-Quellcode:
function EncodingToStr(const AEncoding: TEncoding): string;
begin
  if AEncoding is TEncoding.ANSI then // <-- Operator ist auf diesen Operandentyp nicht anwendbar
    Result:= 'ANSI'
  else if AEncoding is TEncoding.ASCII then // <-- Dito
    Result:= 'ASCII'
  else if AEncoding is TEncoding.UTF7 then // <-- Dito
    Result:= 'UTF7'
  else if AEncoding is TEncoding.UTF8 then // <-- Dito
    Result:= 'UTF8'
  else if AEncoding is TEncoding.Unicode then // <-- Dito
    Result:= 'Unicode'
  else
    Result:= 'ASCII';
Mit einfachem "="-Vergleich kompiliert das zwar, bringt aber immer False weil TEncoding.GetXYZ immer eine neue Instanz von TEncoding erzeugt. Mit InheritsFrom gehts auch nicht, weil z.B. ANSI und ASCII beide ein TMBCSEncoding sind. Nu sind mir irgendwie die Ideen ausgegangen.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Wie kann man TEncoding vergleichen?

  Alt 29. Aug 2017, 15:11
Delphi-Quellcode:
function EncodingToStr(const AEncoding: TEncoding): string;
begin
  Result := '';
  if AEncoding is TUTF7Encoding then // <-- easy
    Result := 'UTF7'
  else if AEncoding is TUTF8Encoding then // <-- easy
    Result := 'UTF8'
  else if AEncoding is TUnicodeEncoding then // <-- easy
    Result := 'Unicode'
  else if AEncoding is TMBCSEncoding then // <-- schwieriger, musste noch die CodePage auswerten
  begin
    if AEncoding.CodePage = Winapi.Windows.GetACP then
      Result := 'ANSI'
    else
      Result := 'ASCII';
  end;
end;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Wie kann man TEncoding vergleichen?

  Alt 29. Aug 2017, 15:14
Man könnte es über TEncoding.EncodingName ( Codepage) versuchen.
Markus Kinzler
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Wie kann man TEncoding vergleichen?

  Alt 29. Aug 2017, 15:16
Korrektur (da man bissel aufpassen muss mit der Vererbung) und gleich mit Konsolentestprogramm:

Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  Winapi.Windows;

var
  I: Integer;

function EncodingToStr(const AEncoding: TEncoding): string;
begin
  Result := '';
  if AEncoding is TUTF8Encoding then // <-- easy
    Result := 'UTF8'
  else if AEncoding is TUTF7Encoding then // <-- easy
    Result := 'UTF7'
  else if AEncoding is TBigEndianUnicodeEncoding then
    Result := 'BigEndianUnicode'
  else if AEncoding is TUnicodeEncoding then // <-- easy
    Result := 'Unicode'
  else if AEncoding is TMBCSEncoding then // <-- schwieriger, musste noch die CodePage auswerten
  begin
    if AEncoding.CodePage = Winapi.Windows.GetACP then
      Result := 'ANSI'
    else
      Result := 'ASCII';
  end;
end;

begin
  try
    Writeln(EncodingToStr(TEncoding.ANSI));
    Writeln(EncodingToStr(TEncoding.ASCII));
    Writeln(EncodingToStr(TEncoding.BigEndianUnicode));
    Writeln(EncodingToStr(TEncoding.Default));
    Writeln(EncodingToStr(TEncoding.Unicode));
    Writeln(EncodingToStr(TEncoding.UTF7));
    Writeln(EncodingToStr(TEncoding.UTF8));

    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Wie kann man TEncoding vergleichen?

  Alt 29. Aug 2017, 15:19
Man könnte es über TEncoding.EncodingName ( Codepage) versuchen.
Auch nicht verkehrt, je nachdem was man möchte:

Delphi-Quellcode:
    Writeln(TEncoding.ANSI.EncodingName);
    Writeln(TEncoding.ASCII.EncodingName);
    Writeln(TEncoding.BigEndianUnicode.EncodingName);
    Writeln(TEncoding.Default.EncodingName);
    Writeln(TEncoding.Unicode.EncodingName);
    Writeln(TEncoding.UTF7.EncodingName);
    Writeln(TEncoding.UTF8.EncodingName);
ergibt:

Code:
1252  (ANSI - Lateinisch I)
20127 (US-ASCII)
1201  (Unicode - Big-Endian)
1252  (ANSI - Lateinisch I)
1200  (Unicode)
65000 (UTF-7)
65001 (UTF-8)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: Wie kann man TEncoding vergleichen?

  Alt 29. Aug 2017, 15:58
Besser nicht über die Namen. Die scheinen ja lokalisiert zu sein.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Wie kann man TEncoding vergleichen?

  Alt 29. Aug 2017, 16:04
Danke euch soweit, die Vergleicherei funktioniert nun soweit. Allerdings habe ich Probleme damit, eine TStringlist, die als Unicode-String vorliegt, gezielt in ein ASCII-Format zu speichern SL.SaveToFile('DerDateiname.txt', TEncoding.ASCII) . Dabei gehen die Umlaute verschütt (ü>u, ß>?)

Die Hilfe warnt da ja ausdrücklich: Achtung: System.SysUtils.TEncoding.ASCII ist ein 7-Bit-ASCII-Zeichensatz und daher mit UnicodeString (der Standard-String-Typ in RAD Studio) nicht kompatibel. Mit einem 7-Bit-Zeichensatz schlägt die Umwandlung von char in widechar (d.h. Unicode) für alle erweiterten ASCII-Zeichen fehl.

Hintergrund ist, dass das Programm dass ich mit meiner gespeicherten Datei versorgen will, kein Unicode oder UTF-8 versteht. Dass sich auf die Weise keine Multibyte-Zeichen speichern lassen ist ja klar, aber die Zeichen aus dem erweiterten ASCII-Zeichensatz (127-255) sollten doch machbar sein.

Ja nu, wieder so ein Fallstrick...
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Wie kann man TEncoding vergleichen?

  Alt 29. Aug 2017, 16:13
Dann nimm doch TEncoding.ANSI!
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Wie kann man TEncoding vergleichen?

  Alt 30. Aug 2017, 08:47
Dann nimm doch TEncoding.ANSI!
Das ist ja ein Ding! Ich bin gar nicht auf die Idee gekommen, ANSI überhaupt zu testen wenn 7-Bit-ASCII schon nicht geht.

Kurz erklärt warum ich hier Probleme habe: Ich lese eine INI-Datei die als UTF8 ohne BOM gespeichert ist, mit TIniFile ein. Da dieses über die API-Funktionen nur ANSI einliest, wandle ich alles mit DecodeUTF8 um. Anschließend sollen die gelesenen Werte in einer konfigurierbaren (!!!) Kodierung wieder geschrieben werden, in eine andere Datei.

Also lese ich da nun den Teststring "äöüßÄÖÜ" aus meiner Quell-INI ein, wandle mit DecodeUTF8 um, baue in einer TStringList die neue Datei zusammen und speichere die dann mit TStringList.SaveToFile('Dateiname.txt', TEncoding.ANSI {.ASCII, .UTF8 oder .Unicode, je nach Benutzereinstellung}) . Der Teststring "äöüßÄÖÜ" liegt nach dem Einlesen tatsächlich noch korrekt als WideString im Speicher. Die fehlerhafte Umkodierung passiert dann beim Speichern aus TStringList:
Code:
Input-UTF8:    äöüßÄÖÜ
Widestring:    äöüßÄÖÜ
Output-ANSI:   äöüßÄÖÜ
Output-ASCII:  aou?AOU
Output-UTF7:   +AOQA9gD8AN8AxADWANw-
Output-UTF8:   äöüßÄÖÜ
Output-Unicode: äöüßÄÖÜ
Hinterher ausgelesen dann jeweils mit Notepad++. Für was ist das ASCII-Encoding dann eigentlich nütze?
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Wie kann man TEncoding vergleichen?

  Alt 30. Aug 2017, 08:52
Kurz erklärt warum ich hier Probleme habe: Ich lese eine INI-Datei die als UTF8 ohne BOM gespeichert ist, mit TIniFile ein. Da dieses über die API-Funktionen nur ANSI einliest, wandle ich alles mit DecodeUTF8 um. Anschließend sollen die gelesenen Werte in einer konfigurierbaren (!!!) Kodierung wieder geschrieben werden, in eine andere Datei.
Warum dann nicht gleich so?
myIniFile := TMemIniFile(AFileName, TEncoding.UTF8); // kommt auch mit Dateien ohne BOM zurecht
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 22:44 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