2008-11-13 5 views
11

Ich habe einen HTTPHandler, der in einer Reihe von CSS-Dateien liest und sie kombiniert und dann GZippt. Einige der CSS-Dateien enthalten jedoch eine Byte Order Mark (aufgrund eines Fehlers in der automatischen TFS 2005-Zusammenführung) und in FireFox wird die BOM als Teil des eigentlichen Inhalts gelesen, so dass es meine Klassennamen usw. versaut. Wie kann ich strippen die Stücklistenzeichen aus? Gibt es einen einfachen Weg, dies zu tun, ohne das Byte-Array manuell zu durchsuchen, um nach "ï" zu suchen?Byte-Order-Markierung von einer Datei entfernen. ReadAllBytes (byte [])

+0

Wird die Stückliste im eigentlichen Text oder nur am Anfang angezeigt? Ich wäre überrascht, wenn ich es irgendwo anders als am Anfang der Daten sehen würde - in diesem Fall sollte es einfach ausreichen, die ersten 3 Bytes (UTF-8 vorausgesetzt) ​​zu ignorieren. –

+0

FWIW, Sie könnten die Dateien in [Notepad ++] (http://notepad-plus.sourceforge.net/uk/site.htm) öffnen und sie ohne die Byte Order Mark speichern. Es ist, was ich in [dieser Frage] tun musste (http://stackoverflow.com/questions/291455/xml-data-at-root-level-is-invalid). –

+2

Ich schrieb den [folgenden Beitrag] (http://andrewmatthewthompson.blogspot.com/2011/02/byte-order-mark-found-using-net.html) nachdem ich auf dieses Problem stieß. Anstatt die Rohbytes des Dateiinhalts mithilfe der BinaryReader-Klasse zu lesen, verwende ich im Wesentlichen die StreamReader-Klasse mit einem bestimmten Konstruktor, der das Bytezeichen der Byte-Reihenfolge automatisch aus den Textdaten entfernt, die ich abrufen möchte. –

Antwort

7

Erweiterung auf Jon's comment mit einer Probe.

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

Zitat OP: * Einige der CSS-Dateien enthalten jedoch eine Byte Order Mark *. .. ** einige ** .. also der Code oben überprüft nicht, ob es eine Stückliste gibt, bevor es überspringt ... –

1

Ein anderer Weg, UTF-8 in ASCII angenommen.

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

Mit Blick auf diesen Code sollte es idealerweise funktionieren. Aber ich bin überrascht, dass es Datei im ANSI-Format speichert. –

+0

'new UTF8Encoding (false)' Der Parameter gibt an, ob die Stückliste hinzugefügt werden soll oder nicht. –

6

Ausbau JaredPar Probe über Unterverzeichnisse rekursiv:

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);    
     }  
    } 
} 

ich nach der Entdeckung, dass C# Stück Code benötigen hatte, dass die UTF-8 BOM korrumpiert Datei, wenn Sie versuchen zu tun eine grundlegende PHP-Download-Datei.