今天搞了一天!因为乱码问题。其实设置很简单,不能用Encoding.uf8编码,而应该用gb2312。在framework中用gb2312没问题,但是在.net core中却会抛出异常。
找到解决方案如下:
第一步
向项目中添加如下包:
System.Text.Encoding.CodePages
所以导入这个包之后,我们将能使用 GB2312 编码。
在程序包管理控制台目录执行如下命令:
dotnet add package System.Text.Encoding.CodePages --version 4.5.1
当然,其中的版本号需要自行修改为最新。此时(2019.01.24)最新版是4.5.01。
别忘了执行 dotnet restore
。
第二步
根据错误提示,我们需要对引用的编码使用 Encoding.RegisterProvider
函数进行注册。
在使用 System.Text.Encoding.GetEncoding ("GB2312")
之前,在代码中执行:
System.Text.Encoding.RegisterProvider (System.Text.CodePagesEncodingProvider.Instance);
注册完之后,获取 GB2312 编码对象就不会报错了,并且可以正常使用其中的函数。
上代码
/// <summary> /// 获取csv数据到listing集合中 /// </summary> /// <param name="filePath"></param> /// <returns></returns> public List<List<string>> GetCsvData(string filePath) { System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); Encoding encoding = Encoding.GetEncoding("gb2312"); var result = new List<List<string>>(); FileStream fs = new FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read); StreamReader sr = new StreamReader(fs, encoding); //记录每次读取的一行记录 string strLine = ""; //逐行读取CSV中的数据 while ((strLine = sr.ReadLine()) != null) { var tableHead = strLine.Split(','); result.Add(tableHead.ToList()); } sr.Close(); fs.Close(); return result; }