Почему текст из Assembly.GetManifestResourceStream () начинается с трех ненужных символов? - PullRequest
9 голосов
/ 23 февраля 2009

У меня есть файл SQL, добавленный в мой проект VS.NET 2008 как встроенный ресурс. Всякий раз, когда я использую следующий код для чтения содержимого файла, возвращаемая строка всегда начинается с трех ненужных символов, а затем с ожидаемым текстом. Я предполагаю, что это как-то связано с Encoding.Default, который я использую, но это всего лишь предположение. Почему этот текст продолжает появляться? Должен ли я просто обрезать первые три символа или есть более информированный подход?

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

Обновление: Теперь я знаю, что мой код работает должным образом, если я просто изменяю последнюю строку, чтобы вернуть строку в кодировке UTF-8. Это всегда будет верно для этого встроенного файла, но всегда ли это будет верно? Есть ли способ проверить любой буфер, чтобы определить его кодировку?

Ответы [ 3 ]

6 голосов
/ 23 февраля 2009

Возможно, файл находится в кодировке utf-8, а Encoding.Default - ASCII. Почему вы не используете определенную кодировку?

Изменить, чтобы ответить на комментарий:

Чтобы угадать кодировку файла, вы можете искать BOM в начале потока. Если он существует, это помогает, если нет, то вы можете только угадать или спросить пользователя.

0 голосов
/ 08 января 2017

У меня была такая же проблема в net.core Вы можете позволить streamreader делать кодировку

 using (var stream = = a.GetManifestResourceStream(resourceName))
    using (var reader = new StreamReader(stream))
       return reader.ReadToEnd();
0 голосов
/ 01 июня 2011

если вы пытаетесь загрузить XML из сборки, вам действительно нужно проверить и пропустить байты метки порядка байтов (сводит меня с ума):

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

И

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

Больше информации здесь

...