Ziel: Verständnis und Praxis im Umgang mit dem UTF8-Code
Ich habe mir jetzt eine Prozedur geschrieben, die mir zu einem Zeichen an der Cursorposition die Codierung ausgibt. Ich poste die mal, vielleicht interessiert es andere auch:
Code: Alles auswählen
uses LazUTF;
procedure TMyEditForm.OptionenUTF8CodeMenuItemClick(Sender: TObject);
{----------------------------------------------------------------------------}
function IntToBin(a:string):string;
{nicht von mir, Quelle unbekannt, funktioniert}
var b,c:string; u,i,z:integer;
begin
b:='';
repeat
c:=a; a:=''; u:=0;
for i:=1 to length(c) do
begin
z:= Ord(c[i]) - 48 + (u*10);
u:=z mod 2; z:=z div 2; a:=a + Chr(48+z);
end;
if a[1]='0' then delete(a,1,1);
b:=Chr(48 + u) + b;
until length(a)=0;
result:=b;
end;
{----------------------------------------------------------------------------}
var Aus:string;
P: PChar;
AnzByte,Stelle:integer;
UniCode:Cardinal;
begin
With SynEdit do
begin
//Zeichen im Text
AnzByte:=UTF8CharacterLength(@SE.Text[SE.SelStart]);
Aus := copy(Text, SelStart, AnzByte);
Lines.Add('Zeichen im Text: '+Aus);
//Unicode dez hex bin
P:=PChar(copy(Text,SelStart,4)); //UTF8 bis 4byte
//Man kopiert doch ein Zeichen, warum also nicht Len=1 statt 4
//Kopiert der copy-Befehl nicht automatisch alle Bytes zu einem Zeichen?
Unicode:=UTF8CharacterToUnicode(P,AnzByte);
Aus:=IntToStr(Unicode);
Aus:=Aus+' $'+IntToHex(UniCode,0);
Aus:=Aus+' '+IntToBin(IntToStr(UniCode));
Lines.Add('UniCode: '+Aus);
//UTF8-Codierung: AnzBytes dez hex bin
Aus:='AnzByte='+IntToStr(AnzByte);
For Stelle:=0 to AnzByte-1 do Aus:=Aus+' '+IntToStr(Ord(P[Stelle]));
For Stelle:=0 to AnzByte-1 do Aus:=Aus+' $'+IntToHex(Ord(P[Stelle]),0);
For Stelle:=0 to AnzByte-1 do Aus:=Aus+' '+IntToBin(IntToStr(Ord(P[Stelle])));
Lines.Add('UTF8-Codierung: '+Aus);
end;
end;
Code: Alles auswählen
A߀(Violinschlüssel)
Zeichen im Text: A
UniCode: 65 $41 1000001
UTF8-Codierung: AnzByte=1 65 $41 1000001
Zeichen im Text: ß
UniCode: 223 $DF 11011111
UTF8-Codierung: AnzByte=2 195 159 $C3 $9F 11000011 10011111
Zeichen im Text: €
UniCode: 8364 $20AC 10000010101100
UTF8-Codierung: AnzByte=3 226 130 172 $E2 $82 $AC 11100010 10000010 10101100
Zeichen im Text: (Violinschlüssel)
UniCode: 119070 $1D11E 11101000100011110
UTF8-Codierung: AnzByte=4 240 157 132 158 $F0 $9D $84 $9E 11110000 10011101 10000100 10011110
Meine Fragen bezogen sich auf die Ausgabe von Zeichen.
Allgemein: Wie arbeitet man mit den ganzen Stringbearbeitungsbefehlen unter UTF8?
Bei Zeichenorientierung müssten die entsprechenden Befehle (copy, inseret, delete, ...)
doch automatisch 1,2 oder 3 Byte benutzen oder muss ich das alles selbst handeln?
Gibt es eine andere Befehlsgruppe, die ich nutzen sollte?
Ein paar Erläuterungen wären mir sehr hilfreich - vielen Dank.