Удалить отметку порядка байтов из файла .ReadAllBytes (byte [])

У меня есть HTTPHandler, который читает набор файлов CSS и объединяет их, а затем архивирует их. Однако некоторые файлы CSS содержат метку порядка байтов (из-за ошибки в автоматическом слиянии TFS 2005), а в FireFox спецификация считывается как часть фактического содержимого, поэтому имена моих классов портятся и т. Д. Как я могу удалить из символов спецификации? Есть ли простой способ сделать это, не просматривая вручную массив байтов в поисках «ï» ¿»?


person JC Grubbs    schedule 13.11.2008    source источник
comment
Появляется ли спецификация в самом тексте или только в самом начале? Я был бы удивлен, увидев это где-нибудь, кроме начала данных - и в этом случае простое игнорирование первых 3 байтов (при условии UTF-8) должно помочь.   -  person Jon Skeet    schedule 13.11.2008
comment
FWIW, вы можете открывать файлы в Notepad ++ и сохранять их без порядка байтов. Отметка. Это то, что мне пришлось сделать в этом вопросе.   -  person George Stocker    schedule 17.11.2008
comment
Я написал следующее сообщение после столкнулся с этой проблемой. По сути, вместо чтения необработанных байтов содержимого файла с помощью класса BinaryReader я использую класс StreamReader со специальным конструктором, который автоматически удаляет знак отметки порядка байтов из текстовых данных, которые я пытаюсь получить.   -  person Andrew Thompson    schedule 21.02.2011


Ответы (5)


Расширение комментария Джона с образцом.

var name = GetFileName();
var bytes = System.IO.File.ReadAllBytes(name);
System.IO.File.WriteAllBytes(name, bytes.Skip(3).ToArray());
person JaredPar    schedule 14.11.2008
comment
Цитата OP: Однако некоторые файлы CSS содержат метку порядка байтов. .. ** некоторые ** .. поэтому приведенный выше код не проверяет наличие спецификации, прежде чем пропустить ее ... - person Pure.Krome; 10.08.2014

Расширение примера JaredPar для рекурсии по подкаталогам:

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

Мне понадобился этот фрагмент кода C # после того, как я обнаружил, что спецификация UTF-8 повреждает файл, когда вы пытаетесь выполнить базовый файл загрузки PHP.

person Olivier de Rivoyre    schedule 19.05.2010

Другой способ, предполагающий UTF-8 в ASCII.

File.WriteAllText(filename, File.ReadAllText(filename, Encoding.UTF8), Encoding.ASCII);
person Tim Bailey    schedule 14.11.2008

Для файла большего размера используйте следующий код; память эффективна!

StreamReader sr = new StreamReader(path: @"<Input_file_full_path_with_byte_order_mark>", 
                    detectEncodingFromByteOrderMarks: true);

StreamWriter sw = new StreamWriter(path: @"<Output_file_without_byte_order_mark>", 
                    append: false, 
                    encoding: new UnicodeEncoding(bigEndian: false, byteOrderMark: false));

var lineNumber = 0;
while (!sr.EndOfStream)
{
    sw.WriteLine(sr.ReadLine());
    lineNumber += 1;
    if (lineNumber % 100000 == 0)
        Console.Write("\rLine# " + lineNumber.ToString("000000000000"));
}

sw.Flush();
sw.Close();
person Ashokan Sivapragasam    schedule 14.03.2018

person    schedule
comment
Глядя на этот код, в идеале он должен работать. Но я удивлен, что он сохраняет файл в формате ANSI. - person Vijay Balkawade; 13.03.2010
comment
new UTF8Encoding(false) параметр указывает, добавлять ли спецификацию или нет. - person Guy Lowe; 04.04.2014