Eine Prüfroutine für UTF-8 könnte etwa so aussehen (ungetestet):
Vom Ansatz her gut aber du prüfst nicht, ob eine Multibyte-Sequenz vorzeitig abgebrochen wird.
Ebenfalls ungetesteter Fix:
Delphi-Quellcode:
function IsUTF8(Bytes: TBytes): Boolean;
var
B: Byte;
weitere: 0..3;
begin
weitere := 0;
for B
in Bytes
do begin
case B
of
$00..$7F:
if weitere > 0
then Exit(False);
{ ASCII }
$80..$BF:
begin
if weitere > 0
then begin
Dec(weitere);
end
else begin
Exit(False);
end;
end;
$C2..$
DF:
if weitere > 0
then Exit(False)
else weitere := 1;
$E0..$EF:
if weitere > 0
then Exit(False)
else weitere := 2;
$F0..$F4:
if weitere > 0
then Exit(False)
else weitere := 3;
else
Exit(False);
end;
end;
Result := True;
end;