今天在开发时遇到一个问题,就是dos内容直接输出到网页上的时候,并没有换行,也不分段,所有字符密密麻麻连在一起了。比如在dos里执行ping www.webkaka.com的命令,得到的是很整体的可读性很高的输出结果。
但是,如果把这些内容直接复制到网页上,并不会有这样的格式化结果,而是出现如下面的一堆字符,完全不具可读性。
Pinging www.a.shifen.com [220.181.112.143] with 32 bytes of data: Reply from 220.181.112.143: bytes=32 time=43ms TTL=54 Reply from 220.181.112.143: bytes=32 time=44ms TTL=54 Reply from 220.181.112.143: bytes=32 time=43ms TTL=54 Reply from 220.181.112.143: bytes=32 time=43ms TTL=54 Ping statistics for 220.181.112.143: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 43ms, Maximum = 44ms, Average = 43ms
这就需要程序来进行字符转换。dos输出的结果,主要包含4个不可见字符,分别是回车符、换行符、制表符和空格符。
我们不能轻而易举的直接进行字符替换就能完事,因为那些字符是不可见的,必须通过间接的方式查找出这些字符,然后才可替换掉。
处理这个问题,我用上了ASCII码,通过ASCII码表,可查出这4个不可见字符的ASCII值分别是回车符(13)、换行符(10)、制表符(9)和空格符(20),现在只需要把dos输出的结果每个字符进行ASCII转换,找出这4个不可见字符,替换成相应的符号即可。其中回车符和换行符均替换为“<br>”,空格符则替换为“ ”,而制表符替换为三个空格符的HTML代码“ ”,这样便能格式化这堆密密麻麻的字符串了。
看看网页输出的格式化结果:
Pinging www.a.shifen.com [220.181.112.143] with 32 bytes of data:
Reply from 220.181.112.143: bytes=32 time=43ms TTL=54
Reply from 220.181.112.143: bytes=32 time=44ms TTL=54
Reply from 220.181.112.143: bytes=32 time=43ms TTL=54
Reply from 220.181.112.143: bytes=32 time=43ms TTL=54
Ping statistics for 220.181.112.143:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 43ms, Maximum = 44ms, Average = 43ms
核心程序代码(asp.net):
1、字符转ASCII值函数
public static int Asc(string character)
{
if (character.Length == 1)
{
System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding();
int intAsciiCode = (int)asciiEncoding.GetBytes(character)[0];
return (intAsciiCode);
}
else
{
throw new Exception("Character is not valid.");
}
}
2、字符替换
假设dos输出的结果赋给变量strResult,格式化后的结果赋给变量strResultFormat。
for (int i = 0; i < strResult.Length; i++)
{
if (Convert.ToInt32(Asc(strResult.Substring(i, 1))) == 13) //回车
{
strResultFormat = strResultFormat + "<br>";
}
else if (Convert.ToInt32(Asc(strResult.Substring(i, 1))) == 10) //换行
{
strResultFormat = strResultFormat + "<br>";
}
else if (Convert.ToInt32(Asc(strResult.Substring(i, 1))) == 32) //空格
{
strResultFormat = strResultFormat + " ";
}
else if (Convert.ToInt32(Asc(strResult.Substring(i, 1))) == 9) //制表符(默认是3个空格的长度)
{
strResultFormat = strResultFormat + " ";
}
else
{
strResultFormat = strResultFormat + strResult.Substring(i, 1);
}
}
最后,附上完整ASCII码对照表。完整ASCII码对照表.txt
☉asp.net实现的计算网页下载速度的方法 (2011-6-11 23:8:19)
☉asp.net正则表达式提取网页网址、标题、图片实例以及过滤所有HTML标签实例 (2010-12-20 19:30:33)
☉总结:asp.net分割字符串的几种方法 (2009-11-22 23:7:12)
☉asp.net页面过滤所有换行符和多余空格 (2009-11-22 20:43:59)
☉Request.Cookies.Remove()无法删除cookie的解决办法 (asp.net) (2009-11-20 19:43:5)
☉如何使用asp.net(c#)下载Excel文件 (2009-11-18 19:21:29)
☉IP反查域名/主机名的ASP.NET源代码 (2009-10-28 15:58:5)
☉asp.net实现通过域名或主机名获得IP地址 (2009-10-28 15:50:20)
☉asp.net(c#)中实现ping功能 (2009-9-7 3:41:46)
☉c#利用WebClient和WebRequest获取网页源代码的比较 (2009-7-15 13:28:21)
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。