Mam HTTPHandler, który czyta w zestawie plików CSS i łącząc je, a następnie GZipping je. Jednak niektóre pliki CSS zawierają znak kolejności bajtów (z powodu błędu w automatycznym scalaniu TFS 2005), a w FireFox BOM jest odczytywany jako część rzeczywistej zawartości, więc zepsuł moje nazwy klas itp. Jak mogę usunąć poza znakami BOM? Czy istnieje prosty sposób na zrobienie tego bez ręcznego przejścia przez tablicę bajtów w poszukiwaniu "ï» ¿"?Usuń znak kolejności bajtów z pliku File.ReadAllBytes (byte [])
Odpowiedz
Poszerzenie na Jon's comment z próbką.
var name = GetFileName();
var bytes = System.IO.File.ReadAllBytes(name);
System.IO.File.WriteAllBytes(name, bytes.Skip(3).ToArray());
OP OZ: * Jednak niektóre pliki CSS zawierają znak kolejności bajtów *. .. ** niektóre ** .. więc powyższy kod nie sprawdza, czy istnieje BOM, zanim go pominie ... –
Innym sposobem, zakładając UTF-8 do 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();
Patrząc na ten kod, najlepiej powinien on działać. Ale jestem zaskoczony, że zapisuje plik w formacie ANSI. –
'new UTF8Encoding (false)' parametr określa, czy dodać BOM czy nie. –
Rozszerzanie JaredPar próbkę rekursja nad podkatalogów:
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);
}
}
}
miałem trzeba, że C# kawałek kodu po odkryciu, że plik UTF-8 psuje BOM podczas próby zrobienia podstawowy plik do pobrania w PHP.
- 1. Usunąć znak zamówienia bajtów z podpisanego pliku PDF?
- 2. PHP - Usuń ostatni znak pliku
- 3. Usuń znak nowej linii z końca pliku
- 4. C# - Czytanie określonych bajtów pliku
- 5. ustalić, czy tablica bajtów zawiera bajtów w określonej kolejności
- 6. Usuń pierwszy znak z jQuery
- 7. Byte dla serializacji bajtów struktury w C#
- 8. Usuń znak kropki z ciągiem C#
- 9. Python/Usuń znak specjalny z ciągu znaków
- 10. Usuń znak z łańcucha przy użyciu javascript
- 11. Usuń pierwszy znak z napisu jeśli 0
- 12. Skip/usuń znak spoza ASCII z sed
- 13. Konkatenowanie bajtów do liczby całkowitej lub krótki zachowaniu znak
- 14. Byte tablicy z wyściółką null bajtów na koniec: Jak skutecznie skopiować do mniejszej tablicy bajtów
- 15. usuń z pliku
- 16. Usuń ostatni znak ciągu znaków
- 17. Błąd sprawdzania poprawności: znacznik kolejności bajtów znaleziony w pliku UTF-8
- 18. Sortowanie tylko pierwszy znak, wzdłuż określonej kolejności
- 19. Konwertowanie bajtów na ciąg C#
- 20. Java: byte [] na Byte []
- 21. konwersji tablicę bajtów do listy <Byte>
- 22. Odczytaj znak utf-8 ze strumienia bajtów
- 23. Jak przekonwertować tablicę bajtów do pliku ZIP
- 24. Jak odtwarzać wideo z tablicy Byte?
- 25. Szybka ciąg byte [] konwersji
- 26. Usuń ścieżkę z nazwy pliku
- 27. Usuń wiele BOMów z pliku
- 28. Usuń ścieżkę z nazwy pliku
- 29. Załaduj tablicę bajtów pliku do pamięci
- 30. varchar2 (n BYTE | CHAR) domyślne -> CHAR lub BYTE
Czy BOM pojawia się w samym tekście, czy tylko na samym początku? Byłbym zaskoczony widząc go nigdzie indziej niż na początku danych - w takim przypadku proste ignorowanie pierwszych 3 bajtów (przy założeniu, że UTF-8) powinno wystarczyć. –
FWIW, możesz otworzyć pliki w [Notepad ++] (http://notepad-plus.sourceforge.net/uk/site.htm) i zapisać je bez znaku zamówienia Byte. To, co musiałem zrobić w [tym pytaniu] (http://stackoverflow.com/questions/291455/xml-data-at-root-level-is-invalid). –
Napisałem [następujący wpis] (http://andrewmatthewthompson.blogspot.com/2011/02/byte-order-mark-found-using-net.html) po obejrzeniu tego problemu. Zasadniczo zamiast odczytywania surowych bajtów zawartości pliku przy użyciu klasy BinaryReader, używam klasy StreamReader z określonym konstruktorem, który automatycznie usuwa znak znacznika kolejności bajtów z danych tekstowych, które próbuję pobrać. –