文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>编程疑难杂症の真的非常一样的文本?!

编程疑难杂症の真的非常一样的文本?!

时间:2011-01-03  来源:Asion Tang

问题描述:

首先,说明我要实现的功能:读取飞信聊天记录信息(TXT格式),并把凡是我发送的信息的发送人都放在“发送人2”这一列。即只要把信息中的发送人与界面上的“昵称”里面的字符串比对一样,即可!

问题就在,当两条信息发送人(看起来)都是一样的时候,偏偏一条放在了“发送人1”,另外一条才放到“发送人2”!这是Bug样本截图

这是Bug样本文件:真的非常一样的文本.zip

这是读取此信息的函数代码:

        private bool YEReadFeiXin(string Contents)
        {
            //只有飞信的导出才有【\t】,没有的话直接退出。
            if ( !Contents.Contains("\t(") )
                return false;
            try
            {
                #region 局部变量声明区

                List<string> feixin = new List<string>();
                List<string> feixinTEMP = new List<string>();
                
                string Separators1 =  "\t(";
                string Separators2 =  "\r\n";
                if ( Contents.Contains("\r\r\n") )
                    Contents = Contents.Replace("\r\r\n" , "\r\n");//把飞信2010版本的导出格式转换为之前的格式。o(︶︿︶)o 唉!
                string Separators3 =  ")说:";

                //定位当前【\t(】制表符的位置
                int idxTab1 = 0;

                //定位下一个Tab索引。
                int idxTab2 = 0;

                //定位当前制表符前面的该符号。
                int idxNextLine1 = 0;

                //定位从下个制表符开始的上一个【\r\n】符号所在位置
                int idxNextLine2 = 0;

                //定位【)说:  】的所在位置
                int idx3 = 0;

                //聊天的昵称
                string name = "";
                //发送时间
                string time = "";
                //聊天内容
                string message = "";

                bool isEnd = false;

                #endregion

                while ( !isEnd )
                {

                    #region 分离各部分信息
                    /* 
                     * 枫之梦23\t(2010-10-19 23:31:00)说:  好了,你快些完成你今天的任务睡觉吧!\r\n我先睡咯!\r\n
                     * 枫之梦23\t(2010-10-19 23:31:00)说:  好了,你快些完成你今天的任务睡觉吧!\r\n我先睡咯!\r\n
                     * 枫之梦23\t(2010-10-19 23:31:00)说:  好了,你快些完成你今天的任务睡觉吧!\r\n我先睡咯!
                     */
                    //定位第一个[\t(]符号的位置。
                    idxTab1 = Contents.IndexOf(Separators1 , idxTab1 + 1);

                    //定位idxTab1前面的【\r\n】符号的位置。
                    idxNextLine1 = Contents.LastIndexOf(Separators2 , idxTab1);
                    if ( idxNextLine1 == -1 )
                        name = Contents.Substring(0, idxTab1);
                    else
                        name = Contents.Substring(idxNextLine1 + Separators2.Length , idxTab1 - idxNextLine1 - Separators2.Length);

                    //定位下一个【\t(】符号的位置。
                    idxTab2 = Contents.IndexOf(Separators1 , idxTab1 + 1);

                    //当不存在下一个【\t(】符号的时候,即没有下一行信息了。
                    if ( idxTab2 == -1 )
                    {
                        isEnd = true;
                        idxNextLine2 = Contents.Length;//除去后面占两个位的/r/n。
                    }
                    else
                    {
                        //定位从下个制表符开始的上一个【\r\n】符号所在位置
                        idxNextLine2 = Contents.LastIndexOf(Separators2 , idxTab2);
                    }

                    //定位【)说:  】的所在位置
                    idx3 = Contents.IndexOf(Separators3 , idxTab1);

                    time = Contents.Substring(idxTab1 + 2 , idx3 - idxTab1 - 2);

                    message = Contents.Substring(idx3 + 5 , idxNextLine2 - idx3 - 5);

                    #endregion

                    //输出显示。
                    int lastIndex = lsvMessageShower.Items.Count;
                    lsvMessageShower.Items.Add("飞信");
                    if ( name == MyNickName.Text )
                    {
                        lsvMessageShower.Items[ lastIndex ].SubItems.Add("");
                        lsvMessageShower.Items[ lastIndex ].SubItems.Add(name);
                    }
                    else
                    {
                        lsvMessageShower.Items[ lastIndex ].SubItems.Add(name);
                        lsvMessageShower.Items[ lastIndex ].SubItems.Add("");
                    }
                        
                    lsvMessageShower.Items[ lastIndex ].SubItems.Add(time);
                    lsvMessageShower.Items[ lastIndex ].SubItems.Add(message);

                }
                return true;
            }
            catch ( Exception ex )
            {
                Debug.Print(ex.ToString());
                return false;
            }

        }

 

尝试解决:

上次发表有一篇同样类型的文章,《编程疑难杂症の无法剔除的神秘重复记录》,里面的问题原因就是所比对的字符串里面包含“不可见字符”。所以首先想到的就是这次是否是一样的问题,结果却很不幸的没有能够解决!以下是VS2008调试界面截图:

可见,这里并没有什么特殊的“不可见字符”的。按照代码里面的逻辑,完全是可以把这两天信息完整的分离开来的。调试过程也证明了,代码逻辑并没有错。

我使用“监视”窗口,对提取出来的发送人Name变量,和界面上显示昵称的TextBox对象进行监视。看到的都是一样的字符串!

至此,我真的不知道这个问题的原因了!期望哪位朋友能帮解决。

程序源代码下载:

源代码の聊天记录管理器110103.zip

2011年1月3日 00:17:19
By:AsionTang

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载