Um nochmal auf plutos ürsprüngliche Frage einzugehen:
Wie Unterschiede ich, ob ein Zeichen ein UTF-8 Zeichen ist?
Wie schon oft erwähnt, kann man eigentlich nicht feststellen, ob ein byte (oder eine andere Speichereinheit) ein Zeichen ist, da es ja nur eine Zahl ist.
Bei einem String kann man über ein
Byte Order Mark feststellen, dass dies einer ist:
Code: Alles auswählen
var
s: String;
begin
isutf8string = (s[1] = $EF) and (s[2] = $BB) and (s[3] = $BF);
end;
Leider werden diese BOMs bei UTF-8 Texten selten angegeben (Lazarus macht das auch nicht).
Wenn man aber einen String hat (bzw. einen Speicherbereich, den man als solchen behandeln will) kann man über die [url=http://de.wikipedia.org/wiki/UTF-8]UTF-8[/utf] Spezifikation ein paar test machen:
Code: Alles auswählen
var b: Byte;
i: Integer;
begin
if (b and $80) = $00 then // 0xxx xxxx
WriteLn('is ascii char') else
if ((b and $80) = $80) and ((b and $60) = $00) then // 10xx xxxx
WriteLn('is utf-8 follow char; the byte before this belongs to this utf-8 char, too') else
begin // 11xx xxxx
i := 0;
for i := 1 to 8 do begin
if (b and $80) = $80 then begin
inc(i);
b shl 1;
end else
break;
end;
WriteLn('the next ',i,' bytes belong to one utf-8 char');
end;
Soll heißen (bezogen auf ein Byte innerhalb des Strings):
- Wenn das Bit 0 ist, dann ist das Byte ein ASCII-Zeichen
- Wenn die ersten beiden Bit 10 sind, dann ist das Byte ein Folge-Zeichen eines Mehr-Byte-Zeichens (d.h. das Zeichen besteht aus mehreren Bytes)
- Wenn die ersten beiden Bit 11 sind, dann ist das Byte das Start-Byte eines Mehr-Byte-Zeichens (d.h. Mehr-Byte-Zeichen fängt hier an). In diesem Byte wird die Anzahl der Folge-Bytes angegeben. Je ein bit = 1 (von links aus gesehen) bedeutet ein Byte mehr: %11000000 = 2Byte; %11100000 = 3Byte; %11110000 = 4Byte (jeweils inkl. Start-Byte)
Ob der String auch in UTF-8 kodiert ist, kann man aber nicht feststellen, da diese Zahlenfolge theoretisch auch durch eine andere Kodierung entstehen kann (der Benutzer hat in diesem Fall andere Zeichen eingegeben, als wir sie darstellen würden).
Ich hoffe das bringt dich irgenwie weiter.
MfG Socke
P.S.: Quelltext nicht getestet; Andere UTF-8-/Widechar-Threads nicht gelesen