Първо: в 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;