电脑技术学习

4.74版通讯录快速查找Bug的总结

admin

    6610出了新版的软件4.74,随之而来的,很多朋友发现了其在通讯录快速查找中的Bug,于是有了很多说法,“liu”姓问题最为引人注目。

    看了其他朋友的文章,我在自己的机子上做了长时间的测试,得出了一些结论。

    这个问题发生不是必然的,有些机子上有,有些机子上没有。有与没有与你的电话簿储存的相关姓氏有很大关系,但与存储的先后顺序是没有关系的。所以才会出现有的朋友说“自己的机上没有这种情况”,而有的朋友说“我有这种情况”。详解如下:

    第一,我们要搞清楚中文通讯录的姓名排序问题。中文通讯录排序时,先比较第一个字的拼音,以拼音中的字母为单位,从做至右进行比较;根据26个英文字母的先后顺序,排在前面的就放在通讯录的前面;如果第一个字拼音相同的话,再比较第二个字的拼音;如果第二个字拼音也相同的话,比较第三个字的拼音;以此类推……

    举个例子:“阿强”的拼音为“aqiang”,“安*”(“*”代表任意个文字)的拼音为“an……”。由于“阿,a”在“安,an”之前,所以“阿强”是排在“安**”之前的。

    结论1:在6610的中文电话簿中,“阿强”是排在“安**”之前的。

    第二,我们要注意NOKIA的电话簿中的快速查找的原理。在其快速查找时,是不区分中文的“姓”和“名”的,而是统一看作拼音来查找。如果要问为什么,原因是中文博大精深,不好区分。

    也举个例子,对拼音“tangan”可以有两种理解,“tan gan,谭干”,另外一种“tang an,唐安”,再举一个,“jiangan”可以理解为“jian gan,简干”以及“jiang an,蒋安”。对于中文的这个特点,NOKIA的软件工程师也无能为力。(个人认为有更好的改良办法,见后)因此只好在快速查找时不区分中文拼音的“姓”和“名”,而统一作为连续的拼音来对待,即作为英文来对待。也就是说:既然不好区分“tangan” 是“tan gan”还是“tang an”,索性不区分,就把他当“tangan”。

    有一点也可以证明它,如过单独存储了“爱瑶瑶”,在快速查找中,依次输入“aiyaoyao”可以正常显示“爱瑶瑶”。也就是说,在快速查找中,是把其认为是连续的拼音。

    同时,对于“aqiang”和“an……”,由于把他们当成了连续的拼音,也就相当于英文。但如果在通讯录选择“查找”(不是“快速查找”)时,因为不涉及到此问题,所以“查找”不受此类问题影响。

    结论2:在快速查找时,程序把“aqiang”和“an……”当成了连续的拼音,也就相当于英文。

    第三,这些问题都发生在可附加后缀音(对拼音来讲)的字上。比如:“a”后加一个“n”就是“an”,“li”后加一个“u”就是“liu”,我先把容易发生问题的姓氏拼音列出一部分来: 

    原拼音           所加后缀             新拼音

     a      阿          n                  an      安

     chen   陈          g                  cheng   程

     fan    范          g                  fang    方

     li     李          u                  liu     刘

     li     李          ang                liang   梁

     tan    谭          g                  tang    唐

     wan    万          g                  wang    王,汪

     yan    阎          g                  yang    杨

     zhan   展          g                  zhang   张

   

    现在我们进入实质性的讨论,对于上面提到了“阿强”和“安**”,当你按了一下2键,输入“a”,符合条件的按顺序依次有:“a”,“an”,“ang”。由于结论1,“阿强”是排在“安**”之前的,按中文排列顺序,系统程序先将中文姓名中第一个字拼音为“a”的全部调出,(如果有“阿牛”,“阿华”,系统都会调出,且由于他们排在“阿强”之前,会先于“阿强”调出)即调出“阿强”进行比较,符合条件,显示“阿强”。(如果有“阿牛”,“阿华”,同样可以显示得出) “a”调出完后,系统把“a”中最后一个“阿强,aqiang”与“a”进行比较,由于结论2,程序把“aqiang”当成了连续的拼音,按英文排序,“aqiang”已经超过了“a”;再用“阿强,aqiang”与“an”比较,又超出了;再用“阿强,aqiang”和“ang”比较,还是超出了。所以系统认为已没有符合“按一次2键,表示a,an,ang”这个条件的,就结束了比较。所以“an……”不被显示。NOKIA的这种比较方法本意是通过筛选比较项而节省时间,加快速度,谁知却埋下了隐患。

    同理,如果通讯录中存有“万叔叔”,“王亚飞”,“王伟”,按数字键若干次表示“wan”,它包含“wan,wang,”,显示“万叔叔”(这个是前提,别让“万叔叔”被其他姓氏屏蔽,比如“万叔叔,wanshushu”会被“wapa”屏蔽,当输入“wa”时,因为在“wapa”超过了“wanshushu”,不显示“wanshushu”),则由于“万叔叔”排在“王*”前面,但“wanshushu”中的“wans”已超过了“wang”,则“wang”姓不会被显示出来。但如果修改“万叔叔”为“万发”,“万发”是在“王*”前面的,同时“wanf”没有超过“wang”所以“wang”不会被屏蔽,此时可以正常显示。

    对于“liu”的问题,与“li”有关系。如果仅存了“李博,libo”,由于“liu”在“libo”之后,不会被屏蔽;如果存了“李响,lixiang”,由于先校对“李”姓,“lixiang”已超过了“liu”,所以“liu”被屏蔽。

    大家在验证的时候,如果出现了和我描述的不符的情形,则是由于你先存的姓名屏蔽了我所例举的中文排在前面的姓名。使用空的电话簿肯定不会出现意外的情形。

    对于这个Bug,我建议NOKIA改进快速查找,无论何时,严格按照中文格式,以每个汉字的首字母为查找索引。例如“王伟”输入“w”或“ww”即可显示,“万叔叔”输入“w”,“ws”或者“wss”都可以显示。这种方法,没有将汉语拼音视为连续的,而是将他们分开,视为独立的拼音结构,所以其排列顺序和中文通讯录是一致的。就避免了上述问题。

大家多多讨论。

标签:

留言评论

留言与评论(共有 0 条评论)
   
验证码: