2008-11-13 8 views
11

Mam HTTPHandler, który czyta w zestawie plików CSS i łącząc je, a następnie GZipping je. Jednak niektóre pliki CSS zawierają znak kolejności bajtów (z powodu błędu w automatycznym scalaniu TFS 2005), a w FireFox BOM jest odczytywany jako część rzeczywistej zawartości, więc zepsuł moje nazwy klas itp. Jak mogę usunąć poza znakami BOM? Czy istnieje prosty sposób na zrobienie tego bez ręcznego przejścia przez tablicę bajtów w poszukiwaniu "ï» ¿"?Usuń znak kolejności bajtów z pliku File.ReadAllBytes (byte [])

+0

Czy BOM pojawia się w samym tekście, czy tylko na samym początku? Byłbym zaskoczony widząc go nigdzie indziej niż na początku danych - w takim przypadku proste ignorowanie pierwszych 3 bajtów (przy założeniu, że UTF-8) powinno wystarczyć. –

+0

FWIW, możesz otworzyć pliki w [Notepad ++] (http://notepad-plus.sourceforge.net/uk/site.htm) i zapisać je bez znaku zamówienia Byte. To, co musiałem zrobić w [tym pytaniu] (http://stackoverflow.com/questions/291455/xml-data-at-root-level-is-invalid). –

+2

Napisałem [następujący wpis] (http://andrewmatthewthompson.blogspot.com/2011/02/byte-order-mark-found-using-net.html) po obejrzeniu tego problemu. Zasadniczo zamiast odczytywania surowych bajtów zawartości pliku przy użyciu klasy BinaryReader, używam klasy StreamReader z określonym konstruktorem, który automatycznie usuwa znak znacznika kolejności bajtów z danych tekstowych, które próbuję pobrać. –

Odpowiedz

7

Poszerzenie na Jon's comment z próbką.

var name = GetFileName(); 
var bytes = System.IO.File.ReadAllBytes(name); 
System.IO.File.WriteAllBytes(name, bytes.Skip(3).ToArray()); 
+2

OP OZ: * Jednak niektóre pliki CSS zawierają znak kolejności bajtów *. .. ** niektóre ** .. więc powyższy kod nie sprawdza, czy istnieje BOM, zanim go pominie ... –

1

Innym sposobem, zakładając UTF-8 do ASCII.

File.WriteAllText(filename, File.ReadAllText(filename, Encoding.UTF8), Encoding.ASCII); 
3
var text = File.ReadAllText(args.SourceFileName); 
var streamWriter = new StreamWriter(args.DestFileName, args.Append, new UTF8Encoding(false)); 
streamWriter.Write(text); 
streamWriter.Close(); 
+0

Patrząc na ten kod, najlepiej powinien on działać. Ale jestem zaskoczony, że zapisuje plik w formacie ANSI. –

+0

'new UTF8Encoding (false)' parametr określa, czy dodać BOM czy nie. –

6

Rozszerzanie JaredPar próbkę rekursja nad podkatalogów:

using System.Linq; 
using System.IO; 
namespace BomRemover 
{ 
    /// <summary> 
    /// Remove UTF-8 BOM (EF BB BF) of all *.php files in current & sub-directories. 
    /// </summary> 
    class Program 
    { 
     private static void removeBoms(string filePattern, string directory) 
     { 
      foreach (string filename in Directory.GetFiles(directory, file Pattern)) 
      { 
       var bytes = System.IO.File.ReadAllBytes(filename); 
       if(bytes.Length > 2 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) 
       { 
        System.IO.File.WriteAllBytes(filename, bytes.Skip(3).ToArray()); 
       } 
      } 
      foreach (string subDirectory in Directory.GetDirectories(directory)) 
      { 
       removeBoms(filePattern, subDirectory); 
      } 
     } 
     static void Main(string[] args) 
     { 
      string filePattern = "*.php"; 
      string startDirectory = Directory.GetCurrentDirectory(); 
      removeBoms(filePattern, startDirectory);    
     }  
    } 
} 

miałem trzeba, że ​​C# kawałek kodu po odkryciu, że plik UTF-8 psuje BOM podczas próby zrobienia podstawowy plik do pobrania w PHP.