Tivemos alguns scripts PHP aqui gerando erro no servidor de homologação por causa de caracteres unicode misteriosos no início do arquivo. Esta marca de ordem de byte é um treco no comecinho do arquivo que de alguma forma diz “em qual das diferentes representações Unicode o texto está codificado.” Só que o PHP não sabe o que é isso, então o servidor simplesmente “cospe” os caracteres pro navegador. Acontece que quando o script PHP tenta modificar os cabeçalhos da requisição (o que precisava ter sido feito antes de o conteúdo ser enviado), o servidor chora: "Warning: Cannot modify header information - headers already sent by (output started at [...]/functions.php:1) in [...]/whatever.php on line [whatever line number]"
Você abre o script no editor e provavelmente ele aparece bonitinho, porque o editor sabe ignorar o BOM causador de confusão. Aí você não sabe o que fazer e senta na calçada e entra em depressão. CALMA! Garimpei por aí, não me lembro mais onde, um scriptzinho Perl maroto que remove a tranqueira do BOM:
#!/usr/bin/perl $num_args = $#ARGV + 1; if ($num_args != 1) { print "\nUsage: naobom.pl filename\n"; exit; } $filename=$ARGV[0]; open(FILE, $filename) || die("Cannot open file $filename for reading."); @file=; $file[0] =~ s/^\xEF\xBB\xBF//; close(FILE); open(FILE, ">>$filename") || die("Cannot open file $filename for writing."); print FILE @file; close(FILE); print "\nDone.\n";
Ele sobrescreve o arquivo, porque eu gosto de viver perigosamente. Aprecie com moderação. Use por sua conta e risco. Com grandes poderes, grandes responsabilidades. Et cetera.
Atualização: agora no github pra quem quiser colaborar. 😉