Search code examples
c#windows-phone-8encodingcharacter-encodingwindows-phone

Encoding string issue reading a CSV file in C#


I am currently developing a Windows Phone 8 application in which one I have to download a CSV file from a web-service and convert data to a C# business object (I do not use a library for this part).

Download the file and convert data to a C# business object is not an issue using RestSharp.Portable, StreamReader class and MemoryStream class.

The issue I face to is about the bad encoding of the string fields.

With the library RestSharp.Portable, I retrieve the csv file content as a byte array and then convert data to string with the following code (where response is a byte array) :

using (var streamReader = new StreamReader(new MemoryStream(response)))
{
  while (streamReader.Peek() >= 0)
  {
    var csvLine = streamReader.ReadLine();
  }
}

but instead of "Jérome", my csvLine variable contains J�rome. I tried several things to obtain Jérome but without success like :

using (var streamReader = new StreamReader(new MemoryStream(response), true))

or

using (var streamReader = new StreamReader(new MemoryStream(response), Encoding.UTF8))

When I open the CSV file with a simple notepad software like notepad++ I obtain Jérome only when the file is encoding in ANSI. But if I try the following code in C# :

using (var streamReader = new StreamReader(new MemoryStream(response), Encoding.GetEncoding("ANSI")))

I have the following exception :

'ANSI' is not a supported encoding name.

Can someone help me to decode correctly my CSV file ?

Thank you in advance for your help or advices !


Solution

  • From the link of Lawtonfogle I tried to use

    using (var streamReader = new StreamReader(new MemoryStream(response), Encoding.GetEncoding("Windows-1252")))
    

    But I had the following error :

    'Windows-1252' is not a supported encoding name.

    Searching why on the internet, I finally found following thread with the following answer that works for me.

    So here the working solution in my case :

    using (var streamReader = new StreamReader(new MemoryStream(response), Encoding.GetEncoding("ISO-8859-1")))
    {
      while (streamReader.Peek() >= 0)
      {
        var csvLine = streamReader.ReadLine();
      }
    }