Първо: в rfc-3629 се казва, че при наличие на разпознавателен механизъм използването на BOM не е желателно (абе направо си е забранено)
Второ: има прост алгоритъм за автоматично разпознаване на UTF-8 кодиран текст.
Кодирането на кратко е следното: всеки кодиран унокод знак започва с поредицата (1(1..))0yyy..., т.е. n на брой битове единица последвани от нулев бит, като броя на началните ненулеви битове показва колко байта общо са за разкодиране. Ако n е по-голямо от нула следващите байтове задължително трябва да започват с 10...., което пък забранява n=1 за първия байт. Или алгоритъма ще озглежда някак си така:
Код:
function NumStartOnes(c: integer): integer;
begin
Result:=0;
while (n and $80) <> 0 do begin
inc(Result);
n:=n shl 1;
end;
end;
function IsUTF8(S: string): boolean;
var
RemBytes: integer;
n: integer;
i: integer;
begin
Result:=false;
RemBytes:=0;
for i:=1 to Length(S) do begin
n:=NumStartOnes(integer(S[i]));
if RemBytes>0 then begin
if n<>1 then
Exit; //wrong start code for remaining bytes
Dec(RemBytes);
end else begin
if (n=1) or (n>4) then
Exit; //wrong start code for first byte
if n>1 then
RemBytes:=n-1;
else
RemBytes:=0;
end;
end;
Result:=RemBytes=0; //if there are missing bytes
end;