mschnell hat geschrieben:Schau mal im deutschen Forum und auch in den englischen Mailing Listen. Da kommt das Thema immer wieder hoch.
Und viele geben sich Mühe, die aufkommenden Fragen zu beantworten. Zeige doch bitte ein ungelöstes Problem, ich versuche immer gern zu helfen.
mschnell hat geschrieben:ein Haupt-Problem ist, dass man durch TStrings (z.B. TStringlist) und die Anbindung der GUI-Bibliothek praktisch gezwungen ist, UTF8 zu verwenden
Das ist kein FPC-Problem sondern ein Lazarus Feature. Dieses Programm funktioniert einwandfrei:
- neues Projekt -> Einfaches Programm
- Projekt in ein Verzeichnis speichern
- Rechtsklick auf Sourcefile -> Dateieinstellungen -> Zeichenkodierung -> CP1252
- folgenden Code einfügen:
Code: Alles auswählen
program project1;
uses Classes, sysutils;
var
SL: TStringList;
begin
SL := TStringList.Create;
SL.Add('Das ist ein Test');
SL.Add('mit ä, ö und ü,');
SL.Add('die auch in CP1252 vorkommen');
SL.SaveToFile(GetCurrentDir + PathDelim + 'test.txt');
SL.Free;
end.
Es wird eine CP1252 kodierte Datei mit entspechend kodiertem String erstellt.
Darüber, wie Lazarus, speziell die LCL mit Strings umgehen soll, wurde vor ein paar Jahren trefflich gestritten. Soll man native Strings oder soll man eine feste Kodierung verwenden? Es gab Beführworter für beide Seiten. Soviel ich weiß, wollten gerade die FPC-Core member, daß die LCL intern mit nativen Strings arbeitet. Wobei es unter Windows schon zwei unterschiedliche gibt, die alten Ansistrings und Unicodestrings (Widestrings), siehe
https://msdn.microsoft.com/de-de/library/windows/desktop/ff381407(v=vs.85).aspx. Letztlich durchgesetzt haben sich die Beführworter eines einheitlichen plattformübergreifenden Strings und der war schon lange vor FPC 3.0.0 intern UTF-8 kodiert, sonst hätte man die ganze LCL umschreiben müssen und sämtlicher Usercode (sollte er denn plattformübergreifend sein, bräuchte {$IFDEF}s, welche Strings je nach OS gerade verwendet werden sollen).
Außerdem ist deine Aussage schlichtweg falsch. Probiere mal eine GUI mit einem Button und einem Memo zu erstellen,
die Kodierung der Unit1 auf CP1252 zu stellen und folgenden Code (und sei erstaunt):
Code: Alles auswählen
uses ..., LConvEncoding;
...
procedure TForm1.Button1Click(Sender: TObject);
var
SL: TStringList;
begin
SL := TStringList.Create;
SL.Add('Das ist ein Test');
SL.Add('mit ä, ö und ü,');
SL.Add('die auch in CP1252 vorkommen');
SL.SaveToFile(GetCurrentDir + PathDelim + 'test.txt');
SL.Text := CP1252ToUTF8(SL.Text);
Memo1.Lines.Assign(SL);
SL.Free;
end;
Ein Hinweis will ich noch mitgeben. Auf ganz lange Sicht ist es geplant, von UTF-8 auf UTF-16 umzustellen. Die Grundsteine wurden bereist gelegt. Da dieses Ziel aber nicht absehbar ist, würde ich erst dann den Shitstorm starten, wenn es erste Diskussionen in den Mailinglists dazu gibt. Hier im deutschen Forum wird es wohl kaum entschieden