C#string.IsNullOrWhiteSpace(" \ t")== true

时间:2014-05-23 18:30:43

标签: c#

我有一行代码

var delimiter = string.IsNullOrWhiteSpace(foundDelimiter) ? "," : foundDelimiter;

foundDelimiter"\t"时,string.IsNullOrWhiteSpace返回true。

为什么呢?什么是解决这个问题的合适方式?

2 个答案:

答案 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 ;
}