by

JB datailee: How to remove UTF8 BOM

Huomaatko miten oikein ulkomaankieltä otsikossa! Suoraan itse asiaan. Jos on jollain kökkökikkareella, kuten Windowsin Notepadillä muokannut utf(8/16..) tiedostoja, joita pitäis sitten käyttää weppiskripteissä, niin huomaatkin, että siellä onkin tiedoston alussa Byte Order Mark, joka ryssii koko homman.

Onneksi Perlikuningas Richard Ishida on koodannut meille tähän poistoskriptin.

#!/usr/local/bin/perl
# program to remove a leading UTF-8 BOM from a file
# works both STDIN -> STDOUT and on the spot (with filename as argument)

if ($#ARGV > 0) {
 print STDERR "Too many arguments!\n";
 exit;
 }

my @file;   # file content
my $lineno = 0;

my $filename = @ARGV[0];
if ($filename) {
 open( BOMFILE, $filename ) || die "Could not open source file for reading.";
 while (<BOMFILE>) {
 if ($lineno++ == 0) {
 if ( index( $_, '' ) == 0 ) {
 s/^\xEF\xBB\xBF//;
 print "BOM found and removed.\n";
 }
 else { print "No BOM found.\n"; }
 }
 push @file, $_ ;
 }
 close (BOMFILE)  || die "Can't close source file after reading.";

 open (NOBOMFILE, ">$filename") || die "Could not open source file for writing.";
 foreach $line (@file) {
 print NOBOMFILE $line;
 }
 close (NOBOMFILE)  || die "Can't close source file after writing.";
 }
else {  # STDIN -> STDOUT
 while (<>) {
 if (!$lineno++) {
 s/^\xEF\xBB\xBF//;
 }
 push @file, $_ ;
 }

 foreach $line (@file) {
 print $line;
 }
 }
 

Sisennykset voi vähän bugata, mut siinähän bugaa. Sitten vielä usage notes:

 for f in `ls`; do ~/rbom.pl $f; done

# loops over a directory and removes BOM from every file

Ei muuta :)

Kommentoi

Comment

  1. Sen verta huomiota, että tarjoilet XHTML 1.1:n text/html:nä, mutta sitä ei saisi ikinä tarjoilla niin, pitäisi puskea vain application/xhtml+xml:nä. Tietty jos tarjoilet sivun sillä, niin sitten IE ei osaa näyttää sivua ollenkaan. Joten vaihda vaikka XHTML 1.0 Strictiin, sitä saa speksien mukaan tarjoilla myös text/html:nä. Latest != greatest.

  2. Nää on noita templaattien tekijöiden nöräysasteen juttuja, että mitä ne milloinkin doctypeen laittavat. Minä laittaisin vain < !doctype html>

    Lisäksi en oikein tiedä mitä haittaa tästä väärillä headereilla tarjoamisesta on, kun se kuitenkin kaikkialla toimii.. Eiköhän teeman tekijä sen joskus korjaa, tai viimeistään kunhan teema taas muuttuu.

    Kiitti kuitenkin huomiosta, en itse tuota tiennytkään, että sivut tarjoillaan xhtml 1.1. Aplication /xhtml+xml kanssa ei myöskään Googlen mainokset aikoinaan toiminut, silloin kun niitä sivuillani vielä oli.