<tip id='1081' />

Thêm đánh dấu UTF8 (BOM) cho nội dung file download

Trong bài Tạo file download trong asp.net, nếu trong nội dung có các ký tự unicode ngoài ASCII (ví dụ như Tiếng Việt có dấu chẳng hạn) thì có thể gặp một số vấn đề khi hiển thị.
Với file download dạng plain text với đuôi txt chẳng hạn thì khi mở bằng notepad sẽ không gặp lỗi hiển thị vì mặc định các phần mềm của Microsoft đọc file plain text với Encoding là UTF-8.

protected void Page_Load(object sender, EventArgs e)
{
	Response.Clear();
	Response.AddHeader(&quot;content-disposition&quot;, &quot;attachment; filename=ABC.txt&quot;);
	Response.ContentType = &quot;text/plain&quot;;
	Response.Write(&quot;Tiếng Việt&quot;);
	Response.End();
}

Nhưng khi file có MIME type khác thì có thể sẽ hiển thị sai. Ví dụ với việc download file csv và mở bằng Microsoft Excel chẳng hạn:

protected void Page_Load(object sender, EventArgs e)
{
	Response.Clear();
	Response.AddHeader(&quot;content-disposition&quot;, &quot;attachment; filename=ABC.csv&quot;);
	Response.ContentType = &quot;application/ms-excel&quot;;
	Response.Write(&quot;STT,Tên\r\n&quot;);
	Response.Write(&quot;1,Tiếng Việt&quot;);
	Response.End();
}

kết quả nhận được như sau: Demo

STT	Tên
1	Tiếng Việt

Lý do là vì dữ liệu thiếu mất các byte đầu tiên (BOM) đánh dấu Encoding của file là UTF-8.
Với encoding UTF-8 cần chèn thêm 3 byte: 0xEF, 0xBB, 0xBF vào đầu file trả về bằng cách sử dụng hàm Response.OutputStream.Write

protected void Page_Load(object sender, EventArgs e)
{
	var bBOM = new byte[] { 0xEF, 0xBB, 0xBF };
	Response.Clear();
	Response.AddHeader(&quot;content-disposition&quot;, &quot;attachment; filename=ABC.csv&quot;);
	Response.ContentType = &quot;application/ms-excel&quot;;
	Response.OutputStream.Write(bBOM, 0, bBOM.Length);
	Response.Write(&quot;STT,Tên\r\n&quot;);
	Response.Write(&quot;1,Tiếng Việt&quot;);
	Response.End();
}

Xem demo kết quả

Chúc bạn thành công!

Khi trích dẫn bài viết từ tek.eten.vn, xin vui lòng ghi rõ nguồn. Chúng tôi sẽ rất cảm ơn bạn!