如何删除存在于某些文本中的任何UTF-8 BOM,而不是在某些文本的开头

我们收到一些文件,这些文件已被另一方联系起来。 在这些文件的中间是一些BOM字符。

有没有办法可以检测到这3个字符并删除它们? 我已经看到很多关于如何从-start-文件中删除BOM的例子……但不是中间的。

假设您的文件足够小以容纳在内存中,并且您有一个Enumerable.Replace扩展方法来替换子序列,那么您可以使用:

 var bytes = File.ReadAllBytes(filePath); var bom = new byte[] { 0xEF, 0xBB, 0xBF }; var empty = Enumerable.Empty(); bytes = bytes.Replace(bom, empty).ToArray(); File.WriteAllBytes(filePath, bytes); 

以下是Replace扩展方法的简单(低效)实现:

 public static IEnumerable Replace( this IEnumerable source, IEnumerable match, IEnumerable replacement) { return Replace(source, match, replacement, EqualityComparer.Default); } public static IEnumerable Replace( this IEnumerable source, IEnumerable match, IEnumerable replacement, IEqualityComparer comparer) { int sLength = source.Count(); int mLength = match.Count(); if (sLength < mLength || mLength == 0) return source; int[] matchIndexes = ( from sIndex in Enumerable.Range(0, sLength - mLength + 1) where source.Skip(sIndex).Take(mLength).SequenceEqual(match, comparer) select sIndex ).ToArray(); var result = new List(); int sPosition = 0; foreach (int mPosition in matchIndexes) { var sPart = source.Skip(sPosition).Take(mPosition - sPosition); result.AddRange(sPart); result.AddRange(replacement); sPosition = mPosition + mLength; } var sLastPart = source.Skip(sPosition).Take(sLength - sPosition); result.AddRange(sLastPart); return result; }