2009-02-23 9 views
7

Tôi có một tệp SQL được thêm vào dự án VS.NET 2008 của tôi dưới dạng tài nguyên được nhúng. Bất cứ khi nào tôi sử dụng đoạn mã sau để đọc nội dung của tệp, chuỗi trả về luôn bắt đầu bằng ba ký tự rác và sau đó là văn bản tôi mong đợi. Tôi cho rằng điều này có liên quan đến Encoding.Default mà tôi đang sử dụng, nhưng đó chỉ là phỏng đoán. Tại sao văn bản này tiếp tục hiển thị? Tôi có nên cắt bớt ba ký tự đầu tiên hoặc có cách tiếp cận thông tin hơn không?Tại sao văn bản từ Assembly.GetManifestResourceStream() bắt đầu bằng ba ký tự rác?

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

Cập nhật: bây giờ tôi biết rằng mã của tôi làm việc như mong đợi nếu tôi chỉ đơn giản là thay đổi dòng cuối cùng để trả lại một UTF-8 chuỗi mã hóa. Nó sẽ luôn luôn đúng cho tập tin nhúng này, nhưng nó sẽ luôn luôn đúng? Có cách nào để kiểm tra bất kỳ bộ đệm để xác định mã hóa của nó?

Trả lời

6

Có thể tệp ở dạng mã hóa utf-8 và Encoding.Default là ASCII. Tại sao bạn không sử dụng mã hóa cụ thể?

Chỉnh sửa để trả lời bình luận:

Để đoán các tập tin mã hóa, bạn có thể tìm kiếm BOM vào lúc bắt đầu của con suối. Nếu nó tồn tại, nó sẽ giúp, nếu không thì bạn chỉ có thể đoán hoặc hỏi người dùng.

+0

Có cách nào để kiểm tra mã hóa không? Vì tôi không chỉ định mã hóa khi tôi lưu tệp, tôi cho rằng đó là mặc định. – flipdoubt

+1

Mã hóa mặc định trong các trình chỉnh sửa khác nhau không giống nhau. –

0

nếu bạn cố gắng tải xml từ lắp ráp bạn thực sự cần phải kiểm tra và bỏ qua các byte đánh dấu thứ tự byte (lái xe cho tôi hạt):

.... 
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

-1

Tôi gặp vấn đề tương tự trong net.core Bạn có thể cho phép trình mã hóa làm mã hóa

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