OSchr hat geschrieben:Sorry, aber mein Lazarus kennt den Typ TUTF8Char nicht...
Zu finden in der Unit LCLType. Also mit
sollte es funktionieren.
OSchr hat geschrieben:Und was auch noch offen ist: wie stellt man den Zeichensatz für den Editor ein? (Ich habe mich bemüht es zu finden)
Einstellbar im Quelltexteditor -> Rechtsklick (PopUp öffnet sich) -> Dateieinstellungen -> Zeichenkodierung -> die gewünschte Kodierung wählen.
Achtung, mit Änderung der Zeichenkodierung werden auch alle Stringkonstanten in dieser Kodierung gespeichert. Normalerweise verwendet Lazarus UTF8 als Standard. Mit der Umstellung der Kodierung des Quelltextes auf z.B. CP1252 werden alle Zeichen auf die entsprechende Kodierung umgestellt. Ein "ä" ist dann nicht mehr als $C3 $A4 sondern als $E4 (nur noch 1 Byte gross) gespeichert (
http://www.utf8-zeichentabelle.de/). Auch wenn die FPC-String-Magic in FPC 3 den größten Teil der internen Stringkonvertierungen übernimmt, muss man wissen welche Besonderheiten so ein Vorgehen mit sich bringt.
Z.B. funktioniert das oben gepostete Beispiel unter der Verwendung der LCL nur, wenn man dem Compiler die anzuwendene Codepage explizit mitteilt:
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
{$CODEPAGE CP1252} // <- dem Compiler sagen, in welcher Kodierung die Stringkonstanten vorliegen
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics,
Dialogs, StdCtrls, LazUTF8;
type
{ TForm1 }
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
function isUpper(c: char): Boolean;
begin
Result := c in ['A'..'Z','Ä','Ö','Ü'];
end;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
var
s: String;
i: Integer;
begin
s := 'HaA1L_LÖ-CHEN.';
for i := Length(s) downto 1 do
if not isUpper(s[i]) then Delete(s, i, 1);
// SetCodePage(RawByteString(s), 1252, False); // <- man könnte notfalls per Hand die Kodierung eines Strings setzen
Memo1.Lines.Add(s);
end;
end.