问号出现而不是空格

时间:2012-08-14 20:16:47

标签: c# .net character-encoding

我有一个CSV文件。在wordpad中查看时,某些行的末尾有空格。当通过C#中的File.ReadAllText(filename)读取时,空格显示为?。可能导致这种情况的原因是什么?

我想消除这个空白,但使用正则表达式并不起作用,因为问号正在弄乱数据。

4 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:0)

  

导致这种情况的原因是什么?

Unicode字母。

答案 2 :(得分:0)

您使用什么编码来阅读文件?

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

当解码器读取八位字节0xA0时,它告诉它是两个octot中编码的代码点的引入八位字节。你得到的值是由编码0xA0代表的代码点?哪里'??'是十六进制的下一个八位字节的值。

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

  • “标准”Windows代码页,windows-1252
  • ISO-8859-1 aka Latin-1
  • ISO-8859-2 aka Latin-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 ) ;
        }
    }

答案 3 :(得分:0)

我知道这是一个旧帖子,但是分享我的修复,所以它可能对某些人有用。

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

这样做时,所有空格字符都被转换为

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

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

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