Hallo Dieter,
wie kann man mit PHP bei einer Datei, oder besser noch bei einem beliebigen String herausfinden, ob sie/er utf-8-encoded ist (kein BOM vorhanden).
So ohne weiteres gar nicht. Wenn keine Bytes (bzw. besserer Begriff wäre hier Oktets) mit Binärwert > 127 und keine Bytes mit < 32 vorkommen, dann hast du eine Zeichenkette, die sowohl gültiges US-ASCII, als auch gültiges UTF-8 als auch gültiges ISO-8859-1 als auch gültiges ISO-8859-2 als auch ... ist. Da hast Du keine Möglichkeit, irgend etwas festzustellen.
Wenn Bytewerte > 127 vorkommen, kannst Du überprüfen, ob korrekte UTF-Kodierung dieser Zeichen vorliegt. Dazu gibt's zahlreiche Routinen im Internet. Aber selbst dann könnte das trotzdem noch z.B. gültiges ISO-8859-1 sein, bei dem zufälligerweise eine derartige Zeichenfolge vorkommt.
Du kannst also nur feststellen, ob ein String *nicht* UTF-8 ist, d.h. sobald Du ungültige kodierte Zeichen entdeckst, kann es schonmal nicht UTF-8 sein. Falls solche Zeichen jedoch nicht vorhanden sind, d.h. alles gültiges UTF-8 wäre, dann kannst Du trotzdem nicht mit Sicherheit sagen, ob der String jetzt wirklich in UTF-8 vorliegt oder nur zufälligerweise so aussieht.
Du könntest höchstens etwas tun, wenn Du die Sprache kennst, in der das ganze geschrieben wird, dann könntest Du nach Wörtern suchen, die in der Sprache vorkommen und Multibyte-UTF8-Sequenzen enthalten, z.B. könntest Du nach »können«, »Fuß«, etc. im Deutschen suchen (natürlich mit entsprechender UTF-8-Kodierung von »ö« und »ß«) und falls so ein Wort vorhanden ist und der ganze String nicht ungültig im UTF8-Sinne ist, dann ist die Wahrscheinlichkeit sehr hoch, dass es Tatsächlich UTF-8 ist. Wenn aber jemand aus Prinzip Umlaute als ae schreibt, dann nützt das natürlich gar nichts.
Was genau willst Du denn erreichen, vielleicht gibt's ja einen anderen Weg?
Viele Grüße,
Christian