我有一个CSV文件。在使用写字板查看时,某些行的末尾有空格。当通过C#中的File.ReadAllText(filename)读取时,空格显示为?。什么可能导致这个?问号出现而非空格
我想消除这个空白,但使用正则表达式不起作用看问题标记正在挖掘数据。
我有一个CSV文件。在使用写字板查看时,某些行的末尾有空格。当通过C#中的File.ReadAllText(filename)读取时,空格显示为?。什么可能导致这个?问号出现而非空格
我想消除这个空白,但使用正则表达式不起作用看问题标记正在挖掘数据。
写字板作为空格显示的字符实际上可能是非ASCII字符,或者该文件使用的编码不在您的C#程序中。
查看十六进制编辑器中的文件。
如果您没有十六进制编辑器,您可以使用File.ReadAllBytes将文件作为字节数组读取,并在您看到问号的地方查找超出可打印ASCII值范围的字节值。
ASCII值为160,这应该是一个不间断的空间,但是显示为?。 – steventnorris 2012-08-14 20:27:40
ASCII值只能达到127(十进制)。传统上将128和更大的值称为扩展ASCII。后来,这些值通过各种Unicode编码标准以各种方式使用。值160的解释完全取决于正在使用的字符编码。 160(十六进制中的0xA0)是UTF-8编码中的NO-BREAK SPACE字符。如果您的观看者不支持UTF-8编码,那么在不知道更多关于它的情况下显示的内容将无法预测。一些观众显示一个?或在这种情况下的其他角色。 – 2012-08-14 20:35:03
解决方案,它是UTF7。我从来没有见过任何人以UTF7发送任何内容。这是一个excel文件....谢谢! – steventnorris 2012-08-14 20:39:14
有什么可能导致这种情况?
Unicode字母。
我该如何正确消除这个问题?从本质上讲,我只是删除空白,但问题标记正在扼杀我的数据。 – steventnorris 2012-08-14 20:18:32
你用什么编码来读取文件?
默认编码(UTF-8)表示2位或更多字节的码位高于0x7F(十进制127)。代码点0xA0(十进制160)以UTF-8编码为0xC2A0。
当解码器读取八位字节0xA0时,这表明它是以两个八进制编码的码位的导入八位字节。您获得的值是由编码0xA0表示的代码点? '??'是十六进制中下一个字节的值。
您需要使用正确的编码读取文件。不知道文件的来源,很难知道。最有可能的犯罪嫌疑人,假设Windows环境中,将这些编码中的一种:
你可以得到正是如此一个实例:
Encoding windows1252 = Encoding.GetEncoding("windows-1252") ;
Encoding latin1 = Encoding.GetEncoding("iso-8859-1" ) ;
Encoding latin2 = Encoding.GetEncoding("iso-8859-2" ) ;
用法是一样的东西:
Encoding windows1252Encoding = Encoding.GetEncoding("windows-1252") ;
using (TextReader tr = new StreamReader(@"c:\foo\bar\bazbat.csz" , windows1252Encoding))
{
string line ;
while (null != (line=tr.ReadLine()))
{
process(line) ;
}
}
我知道这是一个旧帖子,但分享我的修复程序,因此它可能对某个人有用。
我得到了类似的问题。当.CSV文件发布时,我想读取文件并提取内容。
虽然这样做的所有空白字符都拿到转换到
变种contentAsString = Encoding.UTF7 .GetString(contentAsByteArray,0,contentAsByteArray.Length - 1);
添加正确的编码类型,解决了我的问题。
首先我读取文件作为字节数组,然后应用编码类型。
你用什么来查看'File.ReadAllText(filename)'的返回值? – 2012-08-14 20:18:02