2012-11-02 19 views
7

Tôi đang cố gắng sao chép một luồng byte từ một cơ sở dữ liệu, mã hóa nó và cuối cùng hiển thị nó trên một trang web. Tuy nhiên, tôi nhận thấy hành vi khác nhau mã hóa các nội dung theo những cách khác nhau (lưu ý: Tôi đang sử dụng "Tây Âu" mã hóa trong đó có một bộ ký tự Latin và không hỗ trợ ký tự Trung Quốc):C# MemoryStream Encoding Vs. Encoding.GetChars()

var encoding = Encoding.GetEncoding(1252 /*Western European*/); 
using (var fileStream = new StreamReader(new MemoryStream(content), encoding)) 
{ 
    var str = fileStream.ReadToEnd(); 
} 

Vs.

var encoding = Encoding.GetEncoding(1252 /*Western European*/); 
var str = new string(encoding.GetChars(content)); 

Nếu nội dung chứa các ký tự Trung Quốc so với khối đầu tiên của mã sẽ tạo ra một chuỗi như "D $ 教学 而 设计 的", mà là không chính xác bởi vì mã hóa không nên ủng hộ những nhân vật, trong khi khối thứ hai sẽ tạo ra "D $ æ • ™ å¦è € Œè®¾è®¡çš„ "đúng như tất cả trong bộ ký tự Tây Âu.

Giải thích cho sự khác biệt này trong hành vi là gì?

Trả lời

9

Nhà xây dựng StreamReader sẽ tìm kiếm BOM trong luồng và đặt mã hóa từ chúng, ngay cả khi bạn chuyển mã hóa khác.

Nó thấy bảng UTF8 trong dữ liệu của bạn và sử dụng đúng UTF8.

Để ngăn chặn hành vi này, vượt qua false như tham số thứ ba:

var fileStream = new StreamReader(new MemoryStream(content), encoding, false) 
+0

Cảm ơn! bây giờ họ sản xuất cùng một chuỗi. Ngoài sự tò mò, bạn đề xuất nên chặn mã nào tốt hơn? Có bất kỳ lợi thế hay bất lợi của một trong hai? – Sidawy