我正在读取包含特殊字符的csv文件,例如long en dash -、左双引号“和右双引号”,而且我无法找到正确读取和写入这些字符的正确方法。我以为它是UTF8或Unicode,但它将它们读写为正方形或?带着钻石。打开notepad++中的文件以确认。也许还需要另一种特定的编码?下面是我到目前为止使用的代码,用不同的编码尝试了几种不同的代码。
string[] lines = File.ReadAllLines(filePathTxt.Text, Encoding.UTF8);
...
Stream s = new FileStream(filePath, FileMode.Append);
StreamWriter sw = new StreamWriter(s, Encoding.UTF8, 1000, true);投入:
调查-公众
文件:,“A”
出柜
调查�公众
文档:,�A�
当调试器读入字符串数组时,还会显示调试器的问题。
编辑:我也尝试过Unicode。我使用的是NotePad++,Win 10。问题肯定在读取步骤中,因为如果我添加以下行来手动写入一行数据,如下所示:
sw.WriteLine("Surveys – Public");这一行很好地写了破折号,所以它是在从源csv开始读取文件时,在那里字符会被弄乱。我试着用几个不同的编码来阅读,而NotePad++只是将csv显示为ANSI。
发布于 2018-05-25 19:38:31
如果您读取的文件已经在UTF-8中编码,则代码工作正常,但如果使用不同的编码,代码将无法工作。我建议将文件加载到像Notepad++这样的文本编辑器中,它告诉您文件的编码是什么(在状态栏中)。如果它不是编码在UTF-8开始,读和写作为UTF-8将无法工作。
如果要尝试读取系统默认编码中的文件,可以使用Encoding.Default而不是UTF8。然后,在编写该文件时,您应该写入一个新文件,因为您实际上不能将多个编码写入同一个文件。如果UTF-8不是,则默认编码可能是正确的编码。
string filePath = @"C:\users\yourname\desktop\TestFile.txt";
string[] lines = File.ReadAllLines(filePath, Encoding.Default);
string outFile = @"C:\users\yourname\desktop\outfile.txt";
Stream s = new FileStream(outFile, FileMode.Append);
StreamWriter sw = new StreamWriter(s, Encoding.UTF8, 1000, true);
foreach (var line in lines)
sw.WriteLine(line);
sw.Close();或者,如果必须附加到同一个文件,则使用与读取文件相同的编码方式,或重写整个文件。如果原始文件在记事本中看起来没有问题,系统的默认编码很可能是正确的编码。如果要将文件保留在系统的当前编码中,请使用Encoding.Default。如果您想将整个文件的编码更改为UTF-8,我认为您必须重写整个文件,而不是追加。
如果Notepad++在状态栏中显示了这一点,那么您就不能将该文件作为UTF-8读取。

如果Notepad++在状态栏中显示如下内容,则只能使用UTF-8:

您可以在Notepad++中使用"Encoding“菜单的”8“命令使该文件与您的应用程序兼容。
警告:不要混淆“编码在UTF-8”命令和“转换为UTF-8”命令。如果文件看起来是正确的,你想使用“转换为UTF-8”。如果您使用“在UTF-8中编码”,则会将现有数据重新解释为新的编码,而不是将内容更改为使用新的编码。
编辑:将Encoding.GetEncoding(0)更改为Encoding.Default。
发布于 2018-05-25 19:42:23
而不是:
StreamWriter sw = new StreamWriter(s, Encoding.UTF8, 1000, true);用这个:
StreamWriter sw = new StreamWriter(s, Encoding.Unicode, 1000, true);我刚刚试了一下,它在NotePad++中显示得很正确
下面是我运行的用于测试它的示例:
using (StreamWriter swClifor = new StreamWriter("test.txt", true, Encoding.Unicode))
{
string cString = "en dash –, left double quotes “, and right double quotes ”";
swClifor.WriteLine(cString);
}发布于 2018-05-25 20:16:27
哦,天哪,我现在想出来了,这看起来很傻,但事情就是这样的。
NotePad++状态栏显示为ANSI。一开始,我没有提供读或写的编码。
在查看要使用的编码选项时,我发现在默认编码中有一个选项:
string[] lines = File.ReadAllLines(filePathTxt.Text, Encoding.Default);但是我从来没有尝试过这种方法,因为没有指定使用哪种编码必须是默认的,对吧?嗯,我想不是因为实际上在读和写的时候给了它这个,使它现在正常工作了。
https://stackoverflow.com/questions/50535715
复制相似问题