我目前正在开发一个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文件吗?
提前感谢您的帮助或建议!
答案 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以下对我有效。
所以这是我案例中的工作解决方案:
using (var streamReader = new StreamReader(new MemoryStream(response), Encoding.GetEncoding("ISO-8859-1")))
{
while (streamReader.Peek() >= 0)
{
var csvLine = streamReader.ReadLine();
}
}