2008-11-13 26 views
11

Tengo un HTTPHandler que está leyendo en un conjunto de archivos CSS y combinándolos y luego GZipándolos. Sin embargo, algunos de los archivos CSS contienen una marca de orden de bytes (debido a un error en la combinación automática de TFS 2005) y en Firefox se está leyendo la lista de materiales como parte del contenido real, así que está arruinando mis nombres de clase, etc. fuera de los personajes de BOM? ¿Hay una manera fácil de hacer esto sin pasar manualmente por el conjunto de bytes buscando "ï» ¿"?Eliminar marca de orden de bytes de File.ReadAllBytes (byte [])

+0

¿Aparece la lista de materiales en el texto actual o solo al principio? Me sorprendería verlo en cualquier lugar que no sea al comienzo de los datos, en cuyo caso simplemente ignorar los primeros 3 bytes (suponiendo que UTF-8) debería hacer el truco. –

+0

FWIW, podría abrir los archivos en [Notepad ++] (http://notepad-plus.sourceforge.net/uk/site.htm) y guardarlos sin la Marca de orden de bytes. Es lo que tuve que hacer en [esta pregunta] (http://stackoverflow.com/questions/291455/xml-data-at-root-level-is-invalid). –

+2

Escribí la [siguiente publicación] (http://andrewmatthewthompson.blogspot.com/2011/02/byte-order-mark-found-using-net.html) después de encontrarme con este problema. Esencialmente, en lugar de leer los bytes brutos del contenido del archivo utilizando la clase BinaryReader, utilizo la clase StreamReader con un constructor específico que elimina automáticamente el carácter de la marca de orden de bytes de los datos de texto que estoy tratando de recuperar. –

Respuesta

7

Expandiendo en Jon's comment con una muestra.

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

Cotización OP: * Sin embargo, algunos de los archivos CSS contienen una marca de orden de bytes *. .. ** some ** ... por lo que el código anterior no verifica si hay una lista de materiales, antes de que se salte ... –

1

Otra forma, asumiendo UTF-8 a 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

Mirando este código, idealmente debería funcionar. Pero me sorprende que esté guardando el archivo en formato ANSI. –

+0

'new UTF8Encoding (false)' el parámetro indica si se debe agregar la lista de materiales o no. –

6

Ampliación de la muestra JaredPar a recursiva sobre subdirectorios:

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

tuve necesita que C# pieza de código después de descubrir que el archivo de UTF-8 corrompe BOM cuando intenta hacer un archivo básico de descarga de PHP.

Cuestiones relacionadas