У меня есть HTTPHandler, который читает в наборе файлов CSS и объединяет их, а затем GZipping. Тем не менее, некоторые из файлов CSS содержат знак байтового байта (из-за ошибки в автоматическом слиянии TFS 2005), а в FireFox спецификация считывается как часть фактического содержимого, поэтому он заворачивает мои имена классов и т.д. Как я могу удалить из символов BOM? Есть ли простой способ сделать это, не вручную перебирая массив байтов, ища "ï" ¿"?
Удалить отметку байтового байта из файла. ReadAllBytes (byte [])
Ответ 1
Развернувшись на комментарий Джона с образцом.
var name = GetFileName();
var bytes = System.IO.File.ReadAllBytes(name);
System.IO.File.WriteAllBytes(name, bytes.Skip(3).ToArray());
Ответ 2
Развертывание образца 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);
}
}
}
Мне понадобился этот кусок кода С# после обнаружения того, что спецификация UTF-8 повреждает файл при попытке сделать базовый файл загрузки PHP.
Ответ 3
var text = File.ReadAllText(args.SourceFileName);
var streamWriter = new StreamWriter(args.DestFileName, args.Append, new UTF8Encoding(false));
streamWriter.Write(text);
streamWriter.Close();
Ответ 4
Другой способ, предполагающий UTF-8 в ASCII.
File.WriteAllText(filename, File.ReadAllText(filename, Encoding.UTF8), Encoding.ASCII);