C# 修剪不处理空字符

C# 修剪不处理空字符,c#,.net,sql-server,C#,.net,Sql Server,我对修剪方法有一个非常奇怪的问题。我正在尝试修剪从数据库收到的字符串。以下是我目前的方法: string debug = row["PLC_ADDR1_RESULT"].ToString(); SPCFileLog.WriteToLog(String.Format("Debug: ${0}${1}",debug,Environment.NewLine)); debug = debug.Trim(); SPCFileLog.WriteToLog(String.Format("Debug2: ${0

我对修剪方法有一个非常奇怪的问题。我正在尝试修剪从数据库收到的字符串。以下是我目前的方法:

string debug = row["PLC_ADDR1_RESULT"].ToString();
SPCFileLog.WriteToLog(String.Format("Debug: ${0}${1}",debug,Environment.NewLine));
debug = debug.Trim();
SPCFileLog.WriteToLog(String.Format("Debug2: ${0}${1}", debug, Environment.NewLine));
debug = debug.Replace(" ", "");
SPCFileLog.WriteToLog(String.Format("Debug3: ${0}${1}", debug, Environment.NewLine));
它产生如下文件输出:

Debug: $    $
Debug2: $    $
Debug3: $    $ 
检查文件中的十六进制代码发现了一些有趣的东西。假定为空的空格不是十六进制20(空白),但它们被设置为00(空?)


我们的数据库如何包含这样的数据是另一个谜,但无论如何,我需要修剪那些无效的(?)空字符。如何执行此操作?

如果您只想从字符串中删除所有空字符,请尝试以下操作:

debug=debug.Replace(“\0”,string.Empty);
如果只想从字符串的末端删除它们:

debug=debug.Trim('\0');

空字符没有什么特别之处,但它们不被认为是空白。

<代码> String .Trimes()/代码>只是不认为NUL字符(<代码> 0</COD>)是空白。最后,它调用函数来确定空格,而空格并不是这样处理的


坦率地说,我认为这是有道理的。通常
\0
不是空白。

@Will Vousden让我走上了正确的轨道。。。

--但我没有尝试重写或删除该行,而是在点击以linq语句中的控制字符开头的StreamReader/StreamWriter之前过滤掉了该行:

string ctrlChar=“\0”//记事本++中的“NUL”
//linq声明:“在哪里”
!线路启动(ctrlChar)
//也可以很容易地执行“包含”而不是“开始使用”
有关更多上下文:

内部类程序
{
私有静态void Main(字符串[]args)
{
//空间写线
Out.NewLine=“\r\n\r\n”;
WriteLine(“启动解析模式…”);
字符串inputFilePath=@“C:\\ U日志\\ U输入”;
字符串outputFilePath=@“C:\\U日志\\U输出\”;
字符串OUPUTFILNAME=@“consolidated_logs.txt”;
//我们不想解析的字符的起始行
字符串hashtag=“#”;//记录注释
字符串whtSpace=”“;//空白字符
记事本中的字符串ctrlChar=“\0”/“NUL”++
尝试
{
var文件=
从目录.EnumerateFiles中的文件(inputFilePath,“*.log”,SearchOption.TopDirectoryOnly)
从文件中的行。ReadLines(文件)
where!line.StartsWith(hashtag)&&
!line.StartsWith(whtSpace)&&
行!=null&&
!string.IsNullOrWhiteSpace(行)&&
!line.StartsWith(ctrlChar)//CTRL CHAR FILTER
选择新的
{
File=File,
直线
};
使用(StreamWriter writer=newstreamwriter(outputFilePath+outputfilename,true))
{
foreach(文件中的var f)
{
writer.WriteLine($“{f.File},{f.Line}”);
WriteLine($“{f.File},{f.Line}”);//参见控制台
}
WriteLine($“{files.Count()}行已找到。”);
ReadLine();//保持控制台打开
}
}
捕获(未经授权的访问例外uAEx)
{
Console.WriteLine(uAEx.Message);
}
捕获(PathTooLongException-pathEx)
{
Console.WriteLine(路径消息);
}
}
}

让我猜一下您的数据库字符串包含
\0
字符,第二次分享如何在DB datatype中存储数据+举例说明如何查询itData被另一个我无法控制的服务插入数据库。由于NDA的原因,我不允许透露该查询,但可以说它只是varchar字段的SELECT列。unicode代码点为0x0000的字符被归类为控制字符,不是空白。Unicode将代码点0x0000分类为控制字符。@LasseV.Karlsen Christian的链接显示某些Unicode控制字符被视为空白。碰巧
\0
不是其中之一:)非常奇怪的是,他们只硬编码了几个字符,但可能在某个地方也有对
CharUnicodeInfo.IsWhitespace
的完整调用
Char.IsWhitespace
将65536个代码点中的25个报告为空白。@LasseV.Karlsen他们预先区分被“检查”的字符,因为“is whitespace”是“latin-1”字符(所有十六进制<0xFF的字符都是-所以0x00也是)。在这种情况下,它们使用带有视图硬编码值的快捷方式。否则他们会调用你提到的函数。好吧,我想这是有道理的。