Vom Ansatz her gut aber du prüfst nicht, ob eine Multibyte-Sequenz vorzeitig abgebrochen wird.
Gut erkannt
Ist mir dann auch noch so in den Sinn gekommen. Ich würde das dann aber doch etwas kompakter schreiben:
Delphi-Quellcode:
function IsUTF8(Bytes: TBytes): Boolean;
var
B: Byte;
weitere: 0..3;
begin
weitere := 0;
for B
in Bytes
do begin
if weitere > 0
then begin
if not (B
in [$80..$BF])
then Exit(False);
Dec(weitere);
end
else begin
case B
of
$00..$7F: ;
{ ASCII }
$C2..$
DF: weitere := 1;
$E0..$EF: weitere := 2;
$F0..$F4: weitere := 3;
else
Exit(False);
end;
end;
end;
Result := True;
end;