一、案例问题现场
你拿一个带有空格(\0)的字符串如果去给Form上的label或TextEdit赋值时,常常会出现下面的问题:
案例1、
-
string str = "I\0am\0super\0man";
-
Label lbl = new Label();
-
lbl.Text = str;
-
Console.WriteLine("{0}", lbl.Text);
-
MessageBox.Show(" " + lbl.Text + " ");
图1
图1 ,将一个带有空格\0的字符串赋给一个label的text,再对这个label的控制台输出和Form输出比较:
明显Form形式的输出遇到\0就把后面的字符串断开了,而控制能输出则能完整输出。
案例2、
-
string str = "Test";
-
string str2 = "\0of\0file";
-
str = str + str2;
-
-
label1.Text = str;
-
textBox1.Text = str;
-
Console.WriteLine("1111---------{0}\n", textBox1.Text);
-
Console.WriteLine("2222---------{0}\n", label1.Text);
图2
图3
图1 ,将一个没有空格的字符串与一个带有空格\0的字符串相加,从控制台与Form的输出可以看到:
Form的输出,遇到\0就把后面的字符串断掉了;控制台除此外,第二个Console.WriteLine都不见了!
二、解决方案
(1)Trim方法
-
string tt=" aaa ";
-
tt=tt.Trim() 去字符串首尾空格的函数
-
tt=tt.TrimEnd() 去掉字符串尾空格
-
tt=tt.TrimStart() 去掉字符串首空格
(2)通过ASCII码值去掉字符中的空格
由于空格的ASCII码值是32,因此,在去掉字符串中所有的空格时,只需循环访问字符串中的所有字符,并判断它们的ASCII码值是不是32即可。去掉字符串中所有空格的关键代码如下:
-
CharEnumerator CEnumerator = textBox1.Text.GetEnumerator();
-
-
while (CEnumerator.MoveNext())
-
{
-
byte[] array = new byte[1];
-
array = System.Text.Encoding.ASCII.GetBytes(CEnumerator.Current.ToString());
-
int asciicode = (short)(array[0]);
-
if (asciicode != 32)
-
{
-
textBox2.Text += CEnumerator.Current.ToString();
-
}
-
}
这里的方法只能去除半角空格,不能去除全角空格。
(3)Replace方法
使用字符串自带的Replace方法:str.Replace(" ","")------------- str是输入或要检测的字符串。注意第二个是"",中间没有空格的!
-
string afterConverStr = "?!0\0cp";
-
textBox2.Text = afterConverStr.Replace("\0","");
图3
#的Replace函数,有关它的参数需要注意:
如果它的参数是一个表达式,系统会先计算表达式做预处理,再执行替换操作。
比如(GetNameByID为一个函数):
-
String strSource="这是一个示例";
-
strSource=strSource.Replace("姓名",GetNameByID(1));
很显然,strSource是不包含“姓名”的,所以也不会执行任何替换。但是,每执行一次这行替换代码,GetNameByID都会被调用一次。如果GetNameByID是更复杂的逻辑,或者是替换操作在一个循环中,将会极大地影响系统效率。
建议修改为:
-
if(strSource.IndexOf("姓名")>-1)
-
{
-
strSource=strSource.Replace("姓名",GetNameByID(1));
-
}
参考文献
http://blog.csdn.net/dyufei/article/details/5420407
阅读(3499) | 评论(0) | 转发(0) |