2

我有一个 CSV 文件。在写字板中查看时,某些行的末尾有空格。在 C# 中通过 File.ReadAllText(filename) 读取时,空格显示为 ?。这可能是什么原因造成的?

我想消除这个空格,但使用正则表达式不起作用,因为问号正在混淆数据。

4

4 回答 4

4

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

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

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

于 2012-08-14T20:18:03.127 回答
0

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

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

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

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

  • “标准”窗口代码页,windows-1252
  • ISO-8859-1 又名 Latin-1
  • ISO-8859-2 又名 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 ) ;
        }
    }
于 2012-08-14T21:28:27.203 回答
0

这可能是什么原因造成的?

Unicode 字母。

于 2012-08-14T20:17:53.653 回答
0

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

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

这样做时,所有空白字符都被转换为����</p>

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

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

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

于 2016-04-27T07:38:26.083 回答