我有一行代码
var delimiter = string.IsNullOrWhiteSpace(foundDelimiter) ? "," : foundDelimiter;
当foundDelimiter
为"\t"
时,string.IsNullOrWhiteSpace返回true。
为什么呢?什么是解决这个问题的合适方式?
答案 0 :(得分:14)
\t
是制表符,即空格。在C#中可以执行以下任一操作来获取选项卡:
var tab1 = "\t";
var tab2 = " ";
var areEqual = tab1 == tab2; //returns true
编辑:正如Magus所说,当答案被渲染时,SO正在将我的制表符转换为空格。如果你在IDE中,你只需点击引号,标签,引用。
就解决方法而言,我建议您只在条件中添加选项卡检查。
var delimiter = string.IsNullOrWhiteSpace(foundDelimiter) && foundDelimiter != "\t" ? "," : foundDelimiter;
答案 1 :(得分:3)
欢迎使用Unicode。
你期望会发生什么? HT(水平标签)几十年来一直是空白角色。 white-space 字符的“经典”C语言定义由US-ASCII字符组成:
SP
:space(0x20,' '
)HT
:水平标签(0x09,'\t'
)LF
:换行(0x0A,'\n'
)VT
:垂直标签(0x0B,'\v'
)FF
:垂直标签(0x0C,'\f'
)CR
:回车(0x0C,'\r'
)Unicode更多......基于它的方法:它的 white-space 字符的定义是这样的:
Unicode类别的成员 SpaceSeparator :
SPACE
(U + 0020)OGHAM SPACE MARK
(U + 1680)MONGOLIAN VOWEL SEPARATOR
(U + 180E)EN QUAD
(U + 2000)EM QUAD
(U + 2001)EN SPACE
(U + 2002)EM SPACE
(U + 2003)THREE-PER-EM SPACE
(U + 2004)FOUR-PER-EM SPACE
(U + 2005)SIX-PER-EM SPACE
(U + 2006)FIGURE SPACE
(U + 2007)PUNCTUATION SPACE
(U + 2008)THIN SPACE
(U + 2009)HAIR SPACE
(U + 200A)NARROW NO-BREAK SPACE
(U + 202F)MEDIUM MATHEMATICAL SPACE
(U + 205F)IDEOGRAPHIC SPACE
(U + 3000)Unicode类别 LineSeparator 的成员,仅由
组成LINE SEPARATOR
(U + 2028)Unicode类 ParagraphSeparator 的成员,仅由
组成PARAGRAPH SEPARATOR
(U + 2029)这些基本拉丁语/ C0控件/ US-ASCII字符:
CHARACTER TABULATION
(U + 0009)LINE FEED
(U + 000A)LINE TABULATION
(U + 000B)FORM FEED
(U + 000C)CARRIAGE RETURN
(U + 000D)这些C1控件和Latin-1补充字符
NEXT LINE
(U + 0085)NO-BREAK SPACE
(U + 00A0)如果您不喜欢这个定义,请沿着这些行滚动自己(插入您自己的字符集):
public static bool IsNullOrCLanguageWhitespace( this string s )
{
bool value = ( s == null || rxWS.IsMatch(s) ) ;
return value ;
}
private static Regex rxWS = new Regex( @"^[ \t\n\v\f\r]*$") ;
您可能还想添加char
类似物:
public static bool IsCLanguageWhitespace( this char c )
{
bool value ;
switch ( c )
{
case ' ' : value = true ; break ;
case '\t' : value = true ; break ;
case '\n' : value = true ; break ;
case '\v' : value = true ; break ;
case '\f' : value = true ; break ;
case '\r' : value = true ; break ;
default : value = false ; break ;
}
return value ;
}