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 [])
Respuesta
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());
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 ... –
Otra forma, asumiendo UTF-8 a ASCII.
File.WriteAllText(filename, File.ReadAllText(filename, Encoding.UTF8), Encoding.ASCII);
var text = File.ReadAllText(args.SourceFileName);
var streamWriter = new StreamWriter(args.DestFileName, args.Append, new UTF8Encoding(false));
streamWriter.Write(text);
streamWriter.Close();
Mirando este código, idealmente debería funcionar. Pero me sorprende que esté guardando el archivo en formato ANSI. –
'new UTF8Encoding (false)' el parámetro indica si se debe agregar la lista de materiales o no. –
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.
- 1. ¿Escribir archivos de texto sin marca de orden de byte (BOM)?
- 2. Cómo establecer el orden de byte sockaddr_in6 :: sin6_addr en orden de bytes de red?
- 3. Error de validación: Marca de orden por bytes encontrada en el archivo UTF-8
- 4. ¿Por qué veo una marca de orden de bytes en mi servicio web .NET de repente?
- 5. Guid de orden de bytes en .NET
- 6. PixelFormat.Format32bppArgb parece tener orden de bytes mal
- 7. Problema con XDocument y la lista de materiales (marca de orden de bytes)
- 8. Cómo corregir la advertencia de validación de "Marca de orden por bytes en el archivo UTF-8"
- 9. Orden de bytes de Java Byte y parámetros en la pila
- 10. Eliminación de marcas de orden de bytes (BOM) mediante Emacs
- 11. Conversión de orden de bytes de red con "char"
- 12. Marcas de orden de bytes StreamWriter y UTF-8
- 13. determinar si el array de bytes contiene bytes en un orden específico
- 14. Adjuntar datos a la matriz de bytes
- 15. Método IPAddress.GetAddressBytes() - ¿qué orden de bytes?
- 16. Eliminar orden de ActiveRecord scope
- 17. Ignorar marcas de orden de bytes en C++, la lectura de una corriente
- 18. MalformedByteSequenceException: Byte inválido 2 de 2 bytes secuencia UTF-8
- 19. Java - ¿Convertir int a Byte Array de 4 bytes?
- 20. byte no válido 2 de 2 bytes secuencia UTF-8
- 21. Predecir el tamaño de byte de un byte codificado en base64 []
- 22. C# - Leer bytes específicos de un archivo
- 23. Rails created_at orden de la marca de tiempo no concuerda con la orden de identificación
- 24. ¿Cómo se genera la orden de bytes al escribir en TextWriter?
- 25. conversión de bytes a una cadena C#
- 26. ¿Cómo ignoro el marcador de orden de bytes UTF-8 en las comparaciones de cadenas?
- 27. Java - Byte [] a byte []
- 28. ¿Cómo obtener un solo byte de BitArray (sin byte [])?
- 29. Eliminar parte del tiempo de una marca de tiempo
- 30. ¿Cómo eliminar milisegundos de una marca de tiempo?
¿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. –
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). –
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. –