export file with correct encoding

32,295

Solution 1

I believe you should add Response.ContentEncoding = Encoding.Unicode to get right output.

    Encoding encoding = Encoding.UTF8;
    var bytes = encoding.GetBytes("write ÿ or ü please");
    MemoryStream stream = new MemoryStream(bytes);
    StreamReader reader = new StreamReader(stream);
    Response.Clear();
    Response.Buffer = true;
    Response.AddHeader("content-disposition", string.Format("attachment;filename={0}.csv", "filename"));
    Response.Charset = encoding.EncodingName;
    Response.ContentType = "application/text";
    Response.ContentEncoding = Encoding.Unicode;
    Response.Output.Write(reader.ReadToEnd());
    Response.Flush();
    Response.End();

Solution 2

Unfortunately Encoding.Unicode didn't work, using Windows-1252 worked :

Response.Clear();
Response.ContentType = "Application/x-msexcel";
Response.AddHeader("content-disposition", "attachment; filename=\"filename.csv\"");
Response.ContentEncoding = System.Text.Encoding.GetEncoding("Windows-1252");
Response.Write(string.Join(Environment.NewLine, myDataLines));
Response.End();
Share:
32,295

Related videos on Youtube

kiev
Author by

kiev

Updated on February 22, 2020

Comments

  • kiev
    kiev about 4 years

    I don't understand what is missing here. I am trying to export a file in csv format with extended ASCII characters like ÿ or ü but all i get is �
    Do I need to specify something else in the response?

    Encoding encoding = Encoding.UTF8;
    
    //ToCSV writes the string correctly
    var bytes = encoding.GetBytes("write ÿ or ü please");
    MemoryStream stream = new MemoryStream(bytes);
    
    StreamReader reader = new StreamReader(stream);
    //TextWriter tw = new TextWriter();
    Response.Clear();
    Response.Buffer = true;
    
    Response.AddHeader("content-disposition", string.Format("attachment;filename={0}.csv", fileName));
    Response.Charset = encoding.EncodingName;
    Response.ContentType = "application/text";
    Response.Output.Write(reader.ReadToEnd());
    Response.Flush();
    Response.End();
    
  • kiev
    kiev about 13 years
    It was actually specifying the charset by Response.Charset = encoding.BodyName;
  • kiev
    kiev about 13 years
    Maybe there is, but I am not sure how to do that. I will give it a try.
  • SergeyT
    SergeyT about 9 years
    encoding.WebName should be used here. BodyName gives incorrect value for some encodings. For example, "koi8-r" for "windows-1251" encoding.

Related