编码在C#中读取CSV文件的字符串问题

时间:2015-10-02 20:19:57

标签: c# windows-phone-8 encoding character-encoding windows-phone

我目前正在开发一个Windows Phone 8应用程序,其中我必须从Web服务下载CSV文件并将数据转换为C#业务对象(我不为此部分使用库)。

使用RestSharp.Portable,StreamReader类和MemoryStream类下载文件并将数据转换为C#业务对象不是问题。

我面临的问题是关于字符串字段的错误编码。

使用RestSharp.Portable库,我将csv文件内容检索为字节数组,然后使用以下代码将数据转换为字符串(其中response是一个字节数组):

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

但我的csvLine变量包含J�rome,而不是“Jérome”。我尝试了几件事来获得Jérome,但没有成功,如:

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

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

当我使用简单的记事本软件(如notepad ++)打开CSV文件时,仅当文件使用ANSI编码时才会获得Jérome。但是,如果我在C#中尝试以下代码:

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

我有以下例外:

  

'ANSI'不是受支持的编码名称。

有人可以帮我正确解码我的CSV文件吗?

提前感谢您的帮助或建议!

2 个答案:

答案 0 :(得分:0)

你需要选择其中一个。

https://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx

如果你不知道,你可以尝试猜测它。根据答案here,猜测并不是一个完美的解决方案。

  

您无法检测到代码页,需要告诉它。您可以分析字节并猜测它,但这可能会产生一些奇怪的(有时是有趣的)结果。

答案 1 :(得分:0)

从Lawtonfogle的链接我尝试使用

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

但我有以下错误:

  

' Windows的1252'不是受支持的编码名称。

在互联网上搜索原因时,我终于发现以下thread跟随answer以下enter image description here对我有效。

所以这是我案例中的工作解决方案:

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