Próbuję utworzyć plik tekstowy za pomocą VB.Net z kodowaniem UTF8, bez BOM. Czy ktoś może mi pomóc, jak to zrobić?
Mogę napisać plik z kodowaniem UTF8, ale jak usunąć z niego znacznik kolejności bajtów?
edit1: próbowałem kodu w ten sposób;
Dim utf8 As New UTF8Encoding()
Dim utf8EmitBOM As New UTF8Encoding(True)
Dim strW As New StreamWriter("c:\temp\bom\1.html", True, utf8EmitBOM)
strW.Write(utf8EmitBOM.GetPreamble())
strW.WriteLine("hi there")
strW.Close()
Dim strw2 As New StreamWriter("c:\temp\bom\2.html", True, utf8)
strw2.Write(utf8.GetPreamble())
strw2.WriteLine("hi there")
strw2.Close()
1.html zostanie utworzony tylko z kodowaniem UTF8, a 2.html zostanie utworzony z formatem kodowania ANSI.
Uproszczone podejście - http://whatilearnttuday.blogspot.com/2011/10/write-text-files-without-byte-order.html
vb.net
encoding
file-handling
byte-order-mark
Vijay Balkawade
źródło
źródło
Odpowiedzi:
Aby pominąć znacznik kolejności bajtów (BOM), strumień musi używać wystąpienia
UTF8Encoding
innego niżSystem.Text.Encoding.UTF8
(które jest skonfigurowane do generowania BOM). Można to zrobić na dwa proste sposoby:1. Jawne określenie odpowiedniego kodowania:
Wywołać
UTF8Encoding
konstruktora zFalse
dlaencoderShouldEmitUTF8Identifier
parametru.Przekaż
UTF8Encoding
wystąpienie do konstruktora strumienia.2. Korzystanie z domyślnego kodowania:
Jeśli nie dostarczyć
Encoding
doStreamWriter
„s konstruktora w ogóle,StreamWriter
będzie domyślnie stosowania kodowania UTF8 bez BOM, więc dodaje powinien działać tak samo dobrze:Na koniec należy zauważyć, że pominięcie BOM jest dopuszczalne tylko w przypadku UTF-8, a nie w przypadku UTF-16.
źródło
My.Computer.FileSystem.WriteAllText
zapisuje zestawienie komponentów, jeśli nie określono kodowania.My.Computer.FileSystem.WriteAllText
jest wyjątkiem w tym względzie, zgadywanie może wstecznej kompatybilności VB?File.WriteAllText
domyślnie UFT8NoBOM.Spróbuj tego:
źródło
Po prostu użyj metody
WriteAllText
zSystem.IO.File
.Sprawdź przykład z File.WriteAllText .
źródło
Interesująca uwaga w tym względzie: o dziwo, statyczna metoda „CreateText ()” klasy System.IO.File tworzy pliki UTF-8 bez BOM.
Ogólnie jest to źródło błędów, ale w twoim przypadku mogło to być najprostsze obejście :)
źródło
Jeśli nie określisz a
Encoding
podczas tworzenia nowego, używany jestStreamWriter
domyślnyEncoding
obiektUTF-8 No BOM
utworzony za pośrednictwemnew UTF8Encoding(false, true)
.Aby utworzyć plik tekstowy bez użycia konstruktorów BOM, które nie wymagają kodowania:
źródło
leaveOpen
?StreamWriter
używa. Musisz określićnew UTF8Encoding(false, true)
kodowanie, aby móc określićleaveOpen
i nie mieć BOM.Myślę, że Roman Nikitin ma rację. Znaczenie argumentu konstruktora jest odwracane. Fałsz oznacza brak BOM, a prawda oznacza BOM.
Otrzymujesz kodowanie ANSI, ponieważ plik bez BOM, który nie zawiera znaków innych niż ansi, jest dokładnie taki sam jak plik ANSI. Wypróbuj kilka znaków specjalnych w ciągu „cześć tam”, a zobaczysz zmianę kodowania ANSI na bez BOM.
źródło
Kodowanie XML UTF-8 bez BOM
Musimy przesłać dane XML do EPA, a ich aplikacja, która przyjmuje nasze dane wejściowe, wymaga UTF-8 bez BOM. O tak, zwykły UTF-8 powinien być akceptowalny dla wszystkich, ale nie dla EPA. Odpowiedź na to znajduje się w powyższych komentarzach. Dziękuję Roman Nikitin .
Oto fragment kodu w języku C # do kodowania XML:
Sprawdzanie, czy to faktycznie usuwa trzy wiodące znaki z pliku wyjściowego, może być mylące. Na przykład, jeśli używasz Notepad ++ (www.notepad-plus-plus.org), zgłosi „Encode in ANSI”. Wydaje mi się, że większość edytorów tekstu liczy na znaki BOM, aby stwierdzić, czy jest to UTF-8. Aby wyraźnie to zobaczyć, skorzystaj z narzędzia binarnego, takiego jak WinHex (www.winhex.com). Ponieważ szukałem różnicy przed i po, skorzystałem z aplikacji Microsoft WinDiff .
źródło
Możliwe, że tekst wejściowy zawiera znacznik kolejności bajtów. W takim przypadku należy go usunąć przed napisaniem.
źródło
Daje wyniki, które chcesz (myślę).
źródło