2009-02-23 17 views
7

Mam plik SQL dodany do mojego projektu VS.NET 2008 jako zasób osadzony. Ilekroć używam następującego kodu do odczytania zawartości pliku, zwracany ciąg zawsze zaczyna się trzema znakami śmieciowymi, a następnie tekstem, którego oczekuję. Zakładam, że ma to coś wspólnego z Encoding.Default, którego używam, ale to tylko odgadnięcie. Dlaczego ten tekst pojawia się? Czy powinienem po prostu odciąć pierwsze trzy znaki, czy też istnieje bardziej świadome podejście?Dlaczego tekst z Assembly.GetManifestResourceStream() zaczyna się od trzech znaków śmieci?

public string GetUpdateRestoreSchemaScript() 
{ 
    var type = GetType(); 
    var a = Assembly.GetAssembly(type); 
    var script = "UpdateRestoreSchema.sql"; 
    var resourceName = String.Concat(type.Namespace, ".", script); 
    using(Stream stream = a.GetManifestResourceStream(resourceName)) 
    { 
     byte[] buffer = new byte[stream.Length]; 
     stream.Read(buffer, 0, buffer.Length); 
     // UPDATE: Should be Encoding.UTF8 
     return Encoding.Default.GetString(buffer); 
    } 
} 

Aktualizacja: Teraz wiem, że mój kod działa zgodnie z oczekiwaniami, jeśli po prostu zmienić ostatni wiersz, aby powrócić do UTF-8 zakodowany ciąg. To zawsze będzie prawdziwe dla tego pliku osadzonego, ale czy zawsze będzie to prawda? Czy istnieje sposób przetestowania dowolnego bufora w celu ustalenia jego kodowania?

Odpowiedz

6

Prawdopodobnie plik jest w kodowaniu UTF-8 i Encoding.Default to ASCII. Dlaczego nie używasz określonego kodowania?

Edytuj, aby odpowiedzieć na komentarz:

W celu odgadnięcia plik kodowania można szukać BOM na początku strumienia. Jeśli istnieje, to pomaga, jeśli nie, wtedy możesz tylko zgadywać lub pytać użytkownika.

+0

Czy istnieje sposób na przetestowanie kodowania? Ponieważ nie określiłem kodowania podczas zapisywania pliku, założyłem, że jest to ustawienie domyślne. – flipdoubt

+1

Domyślne kodowanie w różnych edytorach nie jest takie samo. –

0

jeśli próbujesz załadować xml z zespołu rzeczywiście trzeba sprawdzać i pominąć bajtów bom (zawiózł mnie do szału):

.... 
byte[] data; 
using (var stream = assembly.GetManifestResourceStream(filename)) 
{ 
    var length = stream.Length; 
    data = new byte[length]; 
    stream.Read(data, 0, (int) length); 
} 
if (!HasUtf8ByteOrderMark(data)) 
{ 
    throw new InvalidOperationException("Expected UTF8 byte order mark EF BB BF"); 
} 
return Encoding.UTF8.GetChars(data.Skip(3).ToArray()); 

I

static bool HasUtf8ByteOrderMark(byte[] data) 
{ 
    var bom = new byte[] { 0xEF, 0xBB, 0xBF }; 
    return data[0] == bom[0] && data[1] == bom[1] && data[2] == bom[2]; 
} 

More information here

-1

Miałem ten sam problem w net.core Możesz pozwolić streamreader zrobić kodowanie

using (var stream = = a.GetManifestResourceStream(resourceName)) 
    using (var reader = new StreamReader(stream)) 
     return reader.ReadToEnd(); 
Powiązane problemy