2009-02-23 5 views
7

Ich habe meinem VS.NET 2008-Projekt eine SQL-Datei als eingebettete Ressource hinzugefügt. Wenn ich den folgenden Code zum Lesen des Inhalts der Datei verwende, beginnt die zurückgegebene Zeichenfolge immer mit drei überflüssigen Zeichen und dann mit dem erwarteten Text. Ich nehme an, das hat etwas mit dem Encoding.Default zu tun, den ich verwende, aber das ist nur eine Vermutung. Warum taucht dieser Text immer wieder auf? Sollte ich nur die ersten drei Buchstaben abschneiden oder gibt es einen informierteren Ansatz?Warum beginnt Text von Assembly.GetManifestResourceStream() mit drei Junk-Zeichen?

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); 
    } 
} 

Update: ich jetzt weiß, dass mein Code wie erwartet funktioniert, wenn ich einfach die letzte Zeile ändern, um eine UTF-8 kodierten String zurück. Es wird immer für diese eingebettete Datei gelten, aber wird es immer wahr sein? Gibt es eine Möglichkeit, einen Puffer zu testen, um seine Codierung zu bestimmen?

Antwort

6

Wahrscheinlich ist die Datei in UTF-8-Codierung und Encoding.Default ist ASCII. Warum verwenden Sie keine spezifische Codierung?

Bearbeiten, um einen Kommentar zu beantworten:

Um die Datei zu erraten, kodieren Sie BOM zu Beginn des Stroms aussehen könnten. Wenn es existiert, hilft es, wenn nicht, dann können Sie nur raten oder Benutzer fragen.

+0

Gibt es eine Möglichkeit, die Codierung zu testen? Da ich beim Speichern der Datei keine Codierung angegeben habe, ging ich davon aus, dass es sich um die Standardeinstellung handelt. – flipdoubt

+1

Die Standardcodierung in verschiedenen Editoren ist nicht identisch. –

0

wenn Sie versuchen, XML laden von der Montage müssen Sie tatsächlich überprüfen und die Bytereihenfolgemarkierung Bytes überspringen (trieb mich Nüsse):

.... 
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()); 

Und

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

Ich hatte das gleiche Problem in net.core Sie können streamreader die Codierung

tun lassen
using (var stream = = a.GetManifestResourceStream(resourceName)) 
    using (var reader = new StreamReader(stream)) 
     return reader.ReadToEnd(); 
Verwandte Themen