SQL Server 的 ltrim 和 rtrim 函数只会取消 char(32) 的字符, char(9) 之类的字符则不会剔除。今天在处理论坛的一个bug时,发现数据多了空格,就是char(9)在作怪。
一个演示SQL代码:
declare @s nvarchar(50) select @s = char(32)+char(9)+'*' print('%'+@s+'%') select @s = ltrim(rtrim(@s)) print('%'+@s+'%') print (str(len(@s)))
而 C# 中则没有类似问题,它剔除了很多非 char(32) 的空格。
演示代码:
static void Main(string[] args) { string s = string.Format("{0}{1}*", (char)32, (char)9); Console.WriteLine("%" + s + "%"); Console.WriteLine(s.Length); s = s.Trim(); Console.WriteLine("%" + s + "%"); Console.WriteLine(s.Length); Console.ReadLine(); }
MSDN上一些空格的资料:
下表列出了被 Trim 方法移除的空白字符。第一列列出了字符的 Unicode 名称,第二列列出了标识该字符的 Unicode 码位的十六进制表示法。
(请注意,尽管传递特定字符时静态 Char.IsWhiteSpace(Char) 方法返回了 true,但该字符不一定被 Trim 方法移除。(作者注:MSDN上这句话很让我困惑,下面2个表中,Char.IsWhiteSpace中的空格都出现在Trim 中的空格了呀?))
Unicode 名称 | Unicode 码位 |
CHARACTER TABULATION | U+0009 |
LINE FEED | U+000A |
LINE TABULATION | U+000B |
FORM FEED | U+000C |
CARRIAGE RETURN | U+000D |
SPACE | U+0020 |
NEXT LINE | U+0085 |
NO-BREAK SPACE | U+00A0 |
OGHAM SPACE MARK | U+1680 |
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 |
ZERO WIDTH SPACE | U+200B |
LINE SEPARATOR | U+2028 |
PARAGRAPH SEPARATOR | U+2029 |
IDEOGRAPHIC SPACE | U+3000 |
ZERO WIDTH NO-BREAK SPACE | U+FEFF |
会被 Char.IsWhiteSpace( 认为是空白字符的包括以下Unicode 字符:
- SpaceSeparator 类别的成员,该类别包括 SPACE 字符 (U+0020)。
- LineSeparator 类别的成员,该类别只包括 LINE SEPARATOR 字符 (U+2028)。
- ParagraphSeparator 类别的成员,该类别只包括 PARAGRAPH SEPARATOR 字符 (U+2029)。
- 字符 CHARACTER TABULATION (U+0009)、LINE FEED (U+000A)、LINE TABULATION (U+000B)、FORM FEED (U+000C)、CARRIAGE RETURN (U+000D)、NEXT LINE (U+0085) 和 NO-BREAK SPACE (U+0000A0)。