【问题标题】:Encoding string issue reading a CSV file in C#在 C# 中读取 CSV 文件的编码字符串问题
【发布时间】:2015-10-02 20:19:57
【问题描述】:

我目前正在开发一个 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 文件吗?

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

【问题讨论】:

  • 首先将您的文件转换为 UTF-8,然后使用该编码
  • 对于 GetEncoding(string),参数必须是所谓的 WebName,即 IANA 注册的编码名称,例如 Windows-1252
  • @AlexanderObersht @archon @Amit :感谢您的帮助。我终于找到了使用using (var streamReader = new StreamReader(new MemoryStream(response), Encoding.GetEncoding("ISO-8859-1"))) 的可行解决方案。

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


【解决方案1】:

您需要选择其中之一。

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

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

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

【讨论】:

  • 感谢您的回答。不幸的是,下面的代码 new StreamReader(new MemoryStream(response), Encoding.GetEncoding("Windows-1252") 给了我错误:“Windows-1252”不是受支持的编码名称。 :(
  • 最后,通过您的链接进行调查,我发现了以下线程:stackoverflow.com/questions/14110730/…,下面的答案对我有用:stackoverflow.com/a/14110867/2762990!我将发布解决方案作为答案:)
【解决方案2】:

来自我尝试使用的 Lawtonfogle 的链接

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

但我有以下错误:

“Windows-1252”不是受支持的编码名称。

在互联网上搜索原因,我终于找到了以下thread 和以下answer 适合我。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多