Um schnell zu prüfen, ob ein String schon UTF-8 encoded ist kann man die mb_string Erweiterung nutzen.
mb_detect_encoding($str, 'UTF-8', true) != 'UTF-8'
oder
!mb_detect_encoding($str, 'UTF-8', true)
Damit kann man dem Problem begegnen, dass ein doppeltes UTF-8 Encoding in PHP einfach den String kaputt macht und weil die Funktion selbst nicht prüft, ob ein Encoding überhaupt nötig ist.
Wenn man mit dem XML-Parser von jcabi-xml arbeitet und der direkt am Anfang der Datei behauptet, es würde nicht nach einer XML aussehen, kann es am UTF8-BOM liegen.
Hier eine kleine und schnelle Lösung:
public static String removeBOM(String payload){
return payload.charAt(0) == '\uFEFF' ? payload.substring(1) : payload;
}