Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Standarddateicodierung (https://www.delphipraxis.net/214764-standarddateicodierung.html)

ringli 5. Mär 2024 20:54

Standarddateicodierung
 
Hallo,

ich habe die Delphi 12 IDE so eingestellt das die Standarddateicodierung UTF-8 ist.

Bei bestimmten Dateien (z.B. RC-Dateien) benötige ich jedoch weiterhin die ANSI-Codierung.

Eigentlich hätte ich gedacht das Delphi die einmal eingestellte Dateicodierung pro Datei beibehält. Leider scheint das nicht so zu sein, denn nach dem Öffnen/Bearbeiten einer RC-Datei im ANSI-Format wird die Dateicodierung auf UTF-8 (also meine eingestellte Standardcodierung) geändert.

Zunächst habe ich mir nichts dabei gedacht, aber wenn die Dateicodierung der RC-Datei auf UTF-8 steht, lässt sich diese Datei nicht mehr kompilieren. Ich muss also die Dateicodierung auf ANSI ändern damit das Kompilieren wieder durchläuft.

Mache ich was falsch, muss ich in der IDE noch etwas einstellen oder kann man irgendwo Ausnahmen definieren?

Uwe Raabe 5. Mär 2024 22:32

AW: Standarddateicodierung
 
Ich kann das hier nicht nachvollziehen. Auch bei Standard UTF8 bleibt die eingestellte Codierung einer im Editor veränderten Datei bei ANSI, wenn sie es vorher war.

himitsu 5. Mär 2024 22:47

AW: Standarddateicodierung
 
Dachte das Standardformat gilt nur für neue Dateien. :gruebel:

ringli 6. Mär 2024 05:59

AW: Standarddateicodierung
 
Ich werde heute Abend mal versuchen ein Minimalbeispiel zu erstellen. Vielleicht passiert das ja nur bei meinen bestehenden Projekten. :pale:

uligerhardt 6. Mär 2024 09:31

AW: Standarddateicodierung
 
Ich hab (mit XE6 :vernupft:) ab und zu den Effekt, dass mir eine Datei (allerdings *.pas) von ANSI auf UTF8 umgestellt wird. Hab's nie genau verfolgt, woran es liegt - vielleicht GExperts-Formatter auf einer Datei mit Umlauten in Kommentaren o.ä. Vielleicht schafft's Delphi auch ohne 3rd-Party-Unterstützung. :zwinker:

himitsu 6. Mär 2024 09:58

AW: Standarddateicodierung
 
Ich wurde bisher beim Speichern vom Delphi normal gefragt, ob ich als UTF-8 speichern will. (z.B. wenn ein Zeichen in der Datei vorkommt, welche nicht ins ANSI passt)
Kann mich jetzt nich an was automatisches erinnern.

Bei den Text-DFMs hingegen, da ändert Delphi gern mal was.
Merk ich beim manuellen Revert, wenn eine Datei abwechselnd Änderungen von D11 und XE bekommen wollte, die ich nicht einchecken mochte.

himitsu 6. Mär 2024 10:03

AW: Standarddateicodierung
 
Was aber nervig ist, der Umgang mit Dateien ohne BOM.

Delphi und viele Windows-Programme gehen von ANSI aus,
während oft Linux und Github von UTF-8 als Standard ausgehn.

Delphi erkennt aber wenigstend, wenn es UTF-8 ist, bzw. ob es sich nicht als UTF-8 laden lässt, während Github z.B. ein ANSI-ä scheiße anzeigt.

Uwe Raabe 6. Mär 2024 10:15

AW: Standarddateicodierung
 
Zitat:

Zitat von himitsu (Beitrag 1534225)
Bei den Text-DFMs hingegen, da ändert Delphi gern mal was.
Merk ich beim manuellen Revert, wenn eine Datei abwechselnd Änderungen von D11 und XE bekommen wollte, die ich nicht einchecken mochte.

Das ist ja schon seit Ewigkeiten so. Es wird aber niemals das Encoding geändert. (Käme mal auf einen Versuch an, Komponentennamen mit Umlauten zu verwenden...)

himitsu 6. Mär 2024 10:40

AW: Standarddateicodierung
 
Doch, das Encoding der DFM wird geändert.

Bei der PAS merkt sich Delphi die glesene Kodierung.
Bei DFMs nicht (immer).
Beim D10/11 bin ich mir nicht sicher, aber XE ändert es öfters, obwohl es den originalen Zustand kennen dürfte.

Intern wird immernoch Binär gearbeitet
und beim Lesen wird eventueller Text nach Binär umgewandelt.
Beim Speichern wird aus Binär NEU der Text generiert.


Delphi-Quellcode:
// unit Classes;

type
  TStreamOriginalFormat = (sofUnknown, sofBinary, sofText, sofUTF8Text);

procedure ObjectBinaryToText(Input, Output: TStream); overload;
procedure ObjectBinaryToText(Input, Output: TStream; var OriginalFormat: TStreamOriginalFormat); overload;
procedure ObjectTextToBinary(Input, Output: TStream); overload;
procedure ObjectTextToBinary(Input, Output: TStream; var OriginalFormat: TStreamOriginalFormat); overload;

procedure ObjectResourceToText(Input, Output: TStream); overload;
procedure ObjectResourceToText(Input, Output: TStream; var OriginalFormat: TStreamOriginalFormat); overload;
procedure ObjectTextToResource(Input, Output: TStream); overload;
procedure ObjectTextToResource(Input, Output: TStream; var OriginalFormat: TStreamOriginalFormat); overload;

function TestStreamFormat(Stream: TStream): TStreamOriginalFormat;

Uwe Raabe 6. Mär 2024 11:48

AW: Standarddateicodierung
 
Das kann aber eigentlich nur dann passieren, wenn irgendwo Identifier mit Umlauten vorkommen. Der relevante Code sieht so aus:
Delphi-Quellcode:
  procedure WriteUTF8Str(const S: string);
  var
    Ident: TBytes; // UTF8String;
  begin
    Ident := TEncoding.UTF8.GetBytes(S);
                                       
    if not UTF8Idents and (Length(Ident) > S.Length) then
      UTF8Idents := True;
    WriteTBytes(Ident);
  end;
Textinhalte wie Caption, TEdit.Text oder auch TMemo.Lines werden wie gehabt mit "#<xxx>" codiert.

Wenn du wieder mal so eine Datei hast, dann prüf das doch mal nach.

himitsu 6. Mär 2024 12:22

AW: Standarddateicodierung
 
Das ist was Anderes.
Es steuert nur wie Strings im Binärstrom gespeichert werden, aus Platzspargründen.
Aber auf das Format der gesamten TextDFM hat diese Funktion keinen Einfluss.

Uwe Raabe 6. Mär 2024 12:39

AW: Standarddateicodierung
 
Zitat:

Zitat von himitsu (Beitrag 1534231)
Das ist was Anderes.
Es steuert nur wie Strings im Binärstrom gespeichert werden, aus Platzspargründen.
Aber auf das Format der gesamten TextDFM hat diese Funktion keinen Einfluss.

Bist du sicher?
Delphi-Quellcode:
      if UTF8Idents then
        Output.Write(TEncoding.UTF8.GetPreamble[0], 3);
      Output.Write(MemoryStream.Memory^, MemoryStream.Size);
Es lässt sich übrigens ganz leicht verifizieren indem man einer Komponente einen Umlaut-behafteten Namen gibt.

Beim Schreiben von String-Werten wird WriteUTF8Str gar nicht verwendet. Siehe ObjectBinaryToText -> ConvertValue -> case vaWString, vaUTF8String und vaString, vaLString

himitsu 6. Mär 2024 12:55

AW: Standarddateicodierung
 
Zitat:

UTF8Idents := True
Ohhh.

Mir war so, als wenn beim Schreiben des Textes die betreffenden Zeichen dann escapet würden, also als ...'#xx'... stünden, wenn es nicht ins ANSI passt.

Bei uns sind die DFMs eigentlich alle UTF-8 mit BOM, aber bei manchen Dateien im XE und D11 merken wir gelegentlich Unterschiede.
TurtoiseDiff und im Sublime werden die BOM nicht angezeigt ... hat man aber im DiffViewer alle Zeilen reverted, dann bleibt die Datei dennoch als Geändert im ChangesLog ... beim erneuten Anzeigen im Turtoise meckert es dann quasi "keine Unterschiede, außer in der Kodierung".




Im Text ist String = String. Im Binär entscheidet es sich zwischen einer Art ShortString (1-Byte-Length und ANSI), einem Ansi-String oder UTF-8-String, je nach Art und Anzahl der Zeichen.

ringli 6. Mär 2024 17:08

AW: Standarddateicodierung
 
Das Problem ist gelöst. :)

Beim Wert "FileDesciption" in meiner "VersionInfo.rc" war ein Umlaut enthalten. Zusammen mit der Windows UTF-8 Regionaleinstellung ist Delphi dann der Meinung die Dateicodierung immer wieder auf UTF-8 ändern zu müssen.

Umlaut ersetzt und es funktiuoniert wie gewünscht.

Danke für die Rückmeldungen und Denkanstösse.

himitsu 6. Mär 2024 17:43

AW: Standarddateicodierung
 
Eine eigene VersionsInfo?
Die delphieigene ist abgeschaltet?

Vor einer Weile war die Ressource in der {project}.res vom {$R *.res}
und jetzt kommt diese Info aus der DPROJ (eventuell auch mehrere/unterschiedliche).

ringli 6. Mär 2024 18:29

AW: Standarddateicodierung
 
Ja, ich verwende eine eigene Versionsinfo. Ebenfalls ein eigenes Manifest.

Die Delphi eigene Versionsinfo ist deaktiviert.

himitsu 6. Mär 2024 18:40

AW: Standarddateicodierung
 
Dann frag ich mich aber, warum deine RC auf das Projekt eine Wirkung haben sollte.

Selbst wenn via {$R xxx.res xxx.rc} in der DPR/DPK, wird die von der DPROJ vorher durch den RessourcenCompiler kompiliert, nicht innerhalb der DPR. :gruebel:

THY4243 6. Mär 2024 19:26

AW: Standarddateicodierung
 
Die Nutzung eigener Versionierung sogar inkl. Manifest geht schon über via {$R xyz.res xyz.rc} in der DPR/DPK - wir hatten das einmal
https://www.delphipraxis.net/1449426-post7.html
Wichtig dabei ist, dass es kein weiteres {$R *.res} in der dpr gibt.

In der DPROJ steht das dann so:
Code:
...
<ItemGroup>
        <DelphiCompile Include="$(MainSource)">
            <MainSource>MainSource</MainSource>
        </DelphiCompile>
        <RcCompile Include="xyz.rc">
            <Form>xyz.RES</Form>
        </RcCompile>
        <DCCReference ...

Uwe Raabe 6. Mär 2024 21:35

AW: Standarddateicodierung
 
Es ist schon möglich mehrere .res Dateien in das Projekt einzubauen. Lediglich ein paar Ressourcetypen, wie z.B. Versions-Info, dürfen nur einmal vorkommen. Wenn du also in den Projektoptionen bei Versionsinformationen in das Projekt übernehmen den Haken entfernst (ggf. bei allen Build-Konfigurationen), dann kannst du deine eigene .res Datei mit der Versions-Info einbinden ohne die IDE-Automatik zu stören und die {$R *.res} kann bleiben. So kann man natürlich auch eigene .res Dateien für weitere Ressourcen (Manifest, Icon) erstellen. Es muss nicht alles in einer .res liegen. So kann man z.B. Versions-Info selber machen, aber Manifest und Icon über die IDE einbinden lassen.

himitsu 6. Mär 2024 22:45

AW: Standarddateicodierung
 
Wir haben 2 Projekte von 85, da aktiviert sich die Versionsressource immer von selbst, wenn das Projekt gespeichert wird.
Aber das dann steht ja auch was im Compilierlog (falls das einer liest)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:40 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