我有一个 CSV 文件。在写字板中查看时,某些行的末尾有空格。在 C# 中通过 File.ReadAllText(filename) 读取时,空格显示为 ?。这可能是什么原因造成的?
我想消除这个空格,但使用正则表达式不起作用,因为问号正在混淆数据。
我有一个 CSV 文件。在写字板中查看时,某些行的末尾有空格。在 C# 中通过 File.ReadAllText(filename) 读取时,空格显示为 ?。这可能是什么原因造成的?
我想消除这个空格,但使用正则表达式不起作用,因为问号正在混淆数据。
很可能是写字板显示为空格的字符实际上是非 ASCII 字符,或者文件使用了您在 C# 程序中不期望的编码。
在十六进制编辑器中查看该文件。
如果您没有方便的十六进制编辑器,您可以使用File.ReadAllBytes将文件作为字节数组读取,并在您看到问号的位置附近查找超出可打印 ASCII 值范围的字节值。
您使用什么编码来读取文件?
默认编码 (UTF-8) 将高于 0x7F(十进制 127)的代码点表示为 2 个或更多八位字节。代码点 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 ) ;
}
}
这可能是什么原因造成的?
Unicode 字母。
我知道这是一篇旧帖子,但分享我的修复,所以它可能对某些人有用。
我遇到了类似的问题。当 .CSV 文件发布时,我想读取文件并提取内容。
这样做时,所有空白字符都被转换为����</p>
var contentAsString = Encoding.UTF7 .GetString(contentAsByteArray, 0, contentAsByteArray.Length - 1);
添加正确的编码类型,解决了我的问题。
首先我将文件作为字节数组读取,然后应用编码类型。