我有一个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编码的字符串,我的代码将按预期工作。这个嵌入式文件总是如此,但它总是如此吗?有没有办法测试任何缓冲区以确定其编码?
答案 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];
}
答案 2 :(得分:-1)
我在net.core中遇到了同样的问题 您可以让streamreader执行编码
using (var stream = = a.GetManifestResourceStream(resourceName))
using (var reader = new StreamReader(stream))
return reader.ReadToEnd();