为什么Assembly.GetManifestResourceStream()中的文本以三个垃圾字符开头?

时间:2009-02-23 18:36:03

标签: c# visual-studio-2008 encoding resources

我有一个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 个答案:

答案 0 :(得分:6)

该文件可能是utf-8编码,而Encoding.Default是ASCII。为什么不使用特定的编码?

编辑以回复评论:

为了猜测文件编码,您可以在流的开头查找BOM。如果它存在,它会有所帮助,如果没有,那么你只能猜测或询问用户。

答案 1 :(得分:0)

如果你试图从程序集加载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];
}

More information here

答案 2 :(得分:-1)

我在net.core中遇到了同样的问题 您可以让streamreader执行编码

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