2012-08-14 49 views
1

我有一个CSV文件。在使用写字板查看时,某些行的末尾有空格。当通过C#中的File.ReadAllText(filename)读取时,空格显示为?。什么可能导致这个?问号出现而非空格

我想消除这个空白,但使用正则表达式不起作用看问题标记正在挖掘数据。

+0

你用什么来查看'File.ReadAllText(filename)'的返回值? – 2012-08-14 20:18:02

回答

4

写字板作为空格显示的字符实际上可能是非ASCII字符,或者该文件使用的编码不在您的C#程序中。

查看十六进制编辑器中的文件。

如果您没有十六进制编辑器,您可以使用File.ReadAllBytes将文件作为字节数组读取,并在您看到问号的地方查找超出可打印ASCII值范围的字节值。

+0

ASCII值为160,这应该是一个不间断的空间,但是显示为?。 – steventnorris 2012-08-14 20:27:40

+0

ASCII值只能达到127(十进制)。传统上将128和更大的值称为扩展ASCII。后来,这些值通过各种Unicode编码标准以各种方式使用。值160的解释完全取决于正在使用的字符编码。 160(十六进制中的0xA0)是UTF-8编码中的NO-BREAK SPACE字符。如果您的观看者不支持UTF-8编码,那么在不知道更多关于它的情况下显示的内容将无法预测。一些观众显示一个?或在这种情况下的其他角色。 – 2012-08-14 20:35:03

+0

解决方案,它是UTF7。我从来没有见过任何人以UTF7发送任何内容。这是一个excel文件....谢谢! – steventnorris 2012-08-14 20:39:14

0

有什么可能导致这种情况?

Unicode字母。

+0

我该如何正确消除这个问题?从本质上讲,我只是删除空白,但问题标记正在扼杀我的数据。 – steventnorris 2012-08-14 20:18:32

0

你用什么编码来读取文件?

默认编码(UTF-8)表示2位或更多字节的码位高于0x7F(十进制127)。代码点0xA0(十进制160)以UTF-8编码为0xC2A0。

当解码器读取八位字节0xA0时,这表明它是以两个八进制编码的码位的导入八位字节。您获得的值是由编码0xA0表示的代码点? '??'是十六进制中下一个字节的值。

您需要使用正确的编码读取文件。不知道文件的来源,很难知道。最有可能的犯罪嫌疑人,假设Windows环境中,将这些编码中的一种:

  • “标准” 窗口代码页,窗口1252
  • ISO-8859-1又称Latin-1的
  • ISO- 8859-2又名拉丁2

你可以得到正是如此一个实例:

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) ; 
     } 
    } 
0

我知道这是一个旧帖子,但分享我的修复程序,因此它可能对某个人有用。

我得到了类似的问题。当.CSV文件发布时,我想读取文件并提取内容。

虽然这样做的所有空白字符都拿到转换到

变种contentAsString = Encoding.UTF7 .GetString(contentAsByteArray,0,contentAsByteArray.Length - 1);

添加正确的编码类型,解决了我的问题。

首先我读取文件作为字节数组,然后应用编码类型。

相关问题