![]() |
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? |
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.
|
AW: Standarddateicodierung
Dachte das Standardformat gilt nur für neue Dateien. :gruebel:
|
AW: Standarddateicodierung
Ich werde heute Abend mal versuchen ein Minimalbeispiel zu erstellen. Vielleicht passiert das ja nur bei meinen bestehenden Projekten. :pale:
|
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:
|
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. |
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. |
AW: Standarddateicodierung
Zitat:
|
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; |
AW: Standarddateicodierung
Das kann aber eigentlich nur dann passieren, wenn irgendwo Identifier mit Umlauten vorkommen. Der relevante Code sieht so aus:
Delphi-Quellcode:
Textinhalte wie Caption, TEdit.Text oder auch TMemo.Lines werden wie gehabt mit "#<xxx>" codiert.
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; Wenn du wieder mal so eine Datei hast, dann prüf das doch mal nach. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:41 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