C# 问号代替空格出现
我有一个CSV文件。在写字板中查看时,某些行的末尾有空格。通过C#中的File.ReadAllText(文件名)读取时,空格显示为?。这可能是什么原因造成的 我想消除这个空白,但使用正则表达式是行不通的,因为问号会弄乱数据 这可能是什么原因造成的 Unicode字母 这可能是什么原因造成的C# 问号代替空格出现,c#,.net,character-encoding,C#,.net,Character Encoding,我有一个CSV文件。在写字板中查看时,某些行的末尾有空格。通过C#中的File.ReadAllText(文件名)读取时,空格显示为?。这可能是什么原因造成的 我想消除这个空白,但使用正则表达式是行不通的,因为问号会弄乱数据 这可能是什么原因造成的 Unicode字母 这可能是什么原因造成的 Unicode字母。很可能是写字板显示为空格的字符实际上是非ASCII字符,或者文件使用的编码是您在C#程序中不希望使用的 在十六进制编辑器中查看该文件 如果您手边没有十六进制编辑器,您可以使用它以字节数组的
Unicode字母。很可能是写字板显示为空格的字符实际上是非ASCII字符,或者文件使用的编码是您在C#程序中不希望使用的 在十六进制编辑器中查看该文件
如果您手边没有十六进制编辑器,您可以使用它以字节数组的形式读入文件,并在您看到问号的位置附近查找超出可打印ASCII值范围的字节值。很可能写字板显示为空格的字符实际上是非ASCII字符,或者该文件使用的编码是您在C#程序中不希望使用的 在十六进制编辑器中查看该文件
如果您手边没有十六进制编辑器,可以使用以字节数组的形式读入文件,并在看到问号的位置附近查找超出可打印ASCII值范围的字节值。您使用什么编码读取文件 默认编码(UTF-8)将高于0x7F(127十进制)的码点表示为2个或更多个八位字节。代码点0xA0(十进制160)在UTF-8中编码为0xC2A0 当解码器读取八位字节0xA0时,表明它是编码在两个八位字节中的码点的引入八位字节。您得到的值是由编码0xA0?表示的代码点??其中“??”是下一个八位字节的十六进制值 您需要以正确的编码读取文件。由于不知道文件的来源,很难知道。假设在Windows环境中,最可能的嫌疑犯是以下编码之一:
- “标准”windows代码页,windows-1252
- ISO-8859-1又名拉丁语-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 ) ;
}
}
您使用什么编码来读取文件 默认编码(UTF-8)将高于0x7F(127十进制)的码点表示为2个或更多个八位字节。代码点0xA0(十进制160)在UTF-8中编码为0xC2A0 当解码器读取八位字节0xA0时,表明它是编码在两个八位字节中的码点的引入八位字节。您得到的值是由编码0xA0?表示的代码点??其中“??”是下一个八位字节的十六进制值 您需要以正确的编码读取文件。由于不知道文件的来源,很难知道。假设在Windows环境中,最可能的嫌疑犯是以下编码之一:
- “标准”windows代码页,windows-1252
- ISO-8859-1又名拉丁语-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 ) ;
}
}
我知道这是一篇老文章,但我会分享我的修复,因此它可能对某些人有用 我也遇到了类似的问题。当发布.CSV文件时,我应该阅读该文件并提取内容 执行此操作时,所有空白字符都被转换为����� var contentAsString=Encoding.UTF7 .GetString(contentAsByteArray,0,contentAsByteArray.Length-1) 添加正确的编码类型,修复了我的问题
首先,我以字节数组的形式读取文件,然后应用编码类型。我知道这是一篇旧文章,但我将分享我的修复,因此它可能对某些人有用 我也遇到了类似的问题。当发布.CSV文件时,我应该阅读该文件并提取内容 执行此操作时,所有空白字符都被转换为����� var contentAsString=Encoding.UTF7 .GetString(contentAsByteArray,0,contentAsByteArray.Length-1) 添加正确的编码类型,修复了我的问题
首先,我以字节数组的形式读取文件,然后应用编码类型。您使用什么来查看
文件的返回值。ReadAllText(文件名)
?您使用什么来查看文件的返回值。ReadAllText(文件名)
?如何正确解决此问题?基本上,我只是删除了空格,但问号却把我的数据弄糟了。我该如何正确地消除这个问题?基本上,我只是删除了空格,但问号弄乱了我的数据。ASCII值是160,这应该是一个不间断的空格,但显示为?。ASCII值只升到127(十进制)。128及以上的值传统上称为扩展ASCII。后来,这些值被各种Unicode编码标准以各种方式使用。值160的解释完全取决于使用的字符编码。160(十六进制中的0xA0)是UTF-8编码中的不间断空格字符。如果您的查看器不支持UTF-8编码,则在不了解更多信息的情况下,无法预测它将显示什么。有些观众会显示一个?或者在这种情况下的其他角色。解决方案,是UTF7。我从未见过有人用UTF7发送任何东西。这是一个excel文件。。。。谢谢ASCII值为160,应为不间断空格,但显示为?。ASCII值最多为127(十进制)。128及以上的值传统上称为扩展ASCII。后来,这些值通过各种Unicode编码标准以各种方式使用。值160的解释完全取决于使用的字符编码。160(十六进制中的0xA0)是UTF-8编码中的不间断空格字符。如果你的vie