2008-11-13 47 views
11

我有一個在一組CSS文件中讀取,並結合他們,然後一個HttpHandler gzip壓縮它們刪除字節順序標記。然而,一些CSS文件包含一個字節順序標記(由於TFS 2005年汽車合併一個bug)和Firefox中的BOM被解讀爲實際內容的一部分,所以它搞砸了我的類名稱等我如何能揭開出BOM字符?有沒有一種簡單的方法來做到這一點,而無需手動通過字節數組尋找「」?從File.ReadAllBytes(字節[])

+0

是在BOM中出現的實際文本本身,或者只是在最開始的?除了數據開始之外的任何地方,我都會驚訝地發現它 - 在這種情況下,忽略前3個字節(假設UTF-8)應該做到這一點。 – 2008-11-13 20:14:30

+0

FWIW,你可以打開[記事本++](http://notepad-plus.sourceforge.net/uk/site.htm)的文件,並保存它們沒有字節順序標記。這是我在[這個問題]必須做的(http://stackoverflow.com/questions/291455/xml-data-at-root-level-is-invalid)。 – 2008-11-16 22:56:02

+2

我碰到這個問題來後寫了[以下職位(http://andrewmatthewthompson.blogspot.com/2011/02/byte-order-mark-found-using-net.html)。本質上,我不使用BinaryReader類讀取文件內容的原始字節,而是使用帶有特定構造函數的StreamReader類,該函數會自動從我試圖檢索的文本數據中刪除字節順序標記字符。 – 2011-02-20 21:06:39

回答

7

擴展在Jon's comment用樣品。

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

的另一種方法,假設UTF-8爲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(); 
6

擴大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 BOM腐敗文件後,當您嘗試做一個基本的PHP下載文件。