Ja, aber die Kodierung ist dabei nebensächlich.
Um Session, Header oder Cookie (schreibend) zu nutzen, darf noch kein Output erfolgt sein, einfach gar keiner. Selbst ein Leerzeichen macht einem also einen Strich durch die Rechnung. Daher gehören solche Angaben ja auch in den absoluten Beginn des Skriptes. Falls Du im Editor keine Zeichen vor dem "<?php" finden kannst, betrachte die Datei mal mit einem Hexeditor.
Wenn Du mutig genug bist, kannst Du ja folgendes kleines Skript ausführen, dass den Anfang aller .php Dateien überprüft und falls erforderlich beschneidet. Wenn Du nur mit einigen wenigen Skripten Probleme hast, kopiere sie lieber mit dem folgenden Skript in ein eigenes Verzeichnis. Und Backups gehen natürlich immer noch vor.
<?php
function firstfive($file)
{
if(is_readable($file))
{
$fh = fopen($file, "r");
$buffer = fread($fh, 5);
fclose($fh);
return $buffer;
}
}
function repairbytes($file)
{
if(is_writeable($file))
{
$fh = fopen($file, "r");
$buffer = fread($fh, 8);
fclose($fh);
$pos = strpos($buffer, "<?php");
if( $pos === false OR $pos < 1)
{
// alles korrekt, kein Grund etwas zu aendern
return false;
} else
{
$in = file($file);
$in[0] = substr($in[0], $pos);
$fh = fopen($file, "w");
foreach ($in as $out) fwrite($fh, $out);
fclose($fh);
return true;
}
} else
{
return false;
}
}
foreach(glob("*.php") as $filename)
{
$start = firstfive($filename);
if($start == "<?php")
{
printf("<b>%-20s</b>: %s<br>\r\n", $filename, htmlspecialchars($start));
} else
{
if (repairbytes($filename) === true)
{
printf("<b>%-20s</b>: %s (repariert)<br>\r\n", $filename, htmlspecialchars($start));
} else
{
printf("<b>%-20s</b>: %s (Reparatur fehlgeschlagen)<br>\r\n", $filename, htmlspecialchars($start));
}
}
}
?>