|

楼主 |
发表于 2019-6-23 18:02
|
显示全部楼层
本帖最后由 流浪铁匠 于 2019-6-24 20:15 编辑
0,通常b后缀函数与对应无b后缀的函数差异在于(以len与lenb为例)前者按字符数统计,后者按字节数统计 而全角符号与汉字等属于双字节字符,字母,数字和半角符号为单字节字符
1,很多文本函数的性质和默认语言有关, =lenb("铁") 结果为1不是bug
2,len的结果和编码有关,unicode编码大于65535的字符的len结果都是2,当然看到单个字符len结果为2的更常见的原因是存在不可见字符
(其实从len结果来说len结果为2的字符比结果为1的多得多,但很少碰到这个性质的原因在于通常情况下大家碰不到unicode编码大于65535的字符)
3,excel的字符集针对Windows有ansi与unicode2类,前者对应char/code函数,后者对应unichar/unicode函数(2013新增)
4,char函数只能产生3万+个相对常见的字符,其中完全等价(半角)空格的有127个(char(32)本身与char(129-254),这127字符的code结果均为32)
5,unichar函数能产生100+万个字符(数量与语言有关,不同语言环境下有略微差异)
6,char与code是不完全的可逆运算,其中最大的坑是code返回编码为63的字符,因为code会把所有不识别的字符全部默认为 ?,大约有100万+个
7,trim的清除能力极其有限,因为它只能清除空格与全角空格,而且只是两端的,中间的不能清除干净会保留一个作为间隔符
(这2个字符的code编码值为32与41377,如果你用的是unicode,那么能清除的半角与全角空格编码分别为32与12288)
8,clean只能清除code结果为char(1-31,128)合计32个字符,
如果用unicode函数则结果为unichar(1-31,128-159[这31个在中文语言下code的结果是0])范围合计63个字
9,上面提到的2个函数无法清除unichar(160)[这个字符在trim的函数帮助里有提及,不间断空格字符,常见于网页,微软自己一直知道这个坑]等不可见字符处理里常见的疑难杂症字符(下文有更隐蔽的)
(针对这点如果你学过pq,可能会发现Text.Trim函数的清除能力比trim强太多了
(pq里的Text.Trim能清除两端的unicode编码为9-13,32,133,160,5760,8192-8202,8232,8233,8239,8287,12288合计25个字符,其中有一些是下文将会提到的特殊字符,
但还是不能清除中间的,中间的需要明确编码后使用Text.Remove清除)
这间接也说明微软自己是知道这部分字符在不可见字符清除问题时造成的障碍的,只是在工作表函数范畴未进行解决)
10,excel里有一组合计3709个字符具有一些特殊性质:
1),字符串内是否存在这批字符等号判断均为相同,如同不存在一般,但len能检查出来
2),相互间也被忽略大小写的函数相互识别
以上结果有版本等差异,有老师用365版本测试过在她的版本里结果是2000+
11,char(9)在单元格字符串里不占宽度但量变引起质变,字符串前的char(9)达到1024个会造成整个字符串隐藏
12,unichar(8204)/unichar(8205)等特殊字符同时符合上文code结果为63,不能用clean/trim清除,单元格内不占宽度,存在与否时字符串用等号判断相同等特殊性质
为新手很难检测与清除的不可见字符(注意上文Text.Trim也没能清除掉这2个不可见字符)
还好len结果是能检查出来的,明确编码就能用substitute+unichar准确清除了
13,excel存在大量简写方式但微软似乎没公布过,我之前帖子里也有老师说过规范写法才是正道
不过在测试时还是发现了几个比较有意思的
当然这部分最极致的发现是我之前用6个字符就弄疯一堆人的公式 =-" :"
(这表达式有版本和语言差异,出现自2013版本,该表达式与衍生类型推算计算式后发现疑似时间的一类特殊表达式但算法很特殊
这里只作为特殊案例介绍,不要深究,可能是bug,微软也没有解释过相关规则与用途
14,b后缀文本函数与通配符组合的特殊用途是searchb+? 定位字符串内第1个单字节字符
15,b后缀函数还有个特殊性质是提取双字节字符(如汉字)时如果提取长度为1则提取结果并不是半个汉字,而是空格
16,以上针对的是unicode编码小于65536的常规字符,因为如果用mid提取编码大于65535的字符
它是按照字符的编码提取的(工作表函数只有mid有这个能力,left和right提取的是整个字符)
利用这个性质mid可以把2个这种字符重组为新字符
17,mid与left/right在很多方面有较大的参数性质差异
除了上一条的提取编码还是整个字符的机理差异外
还有:
1)mid参数为严格取整而left/right还是之前帖子提及的0.99999976146501这个临界点
2)mid 有上限值(长整型特征2147483647)但left/right能达到excel数值上限
这些结果都说明了mid本质和left/right有很大的本质区别
18,支持通配符的函数都有一个性质是字符串的字符数不能超过255否则报错
19,具有通配性的字符不只3个,目前发现其他3个字符在一定程度上也有所谓通配性
20,上面一条已经涉及了,在excel里有极少数字符不是数值但默认右对齐,在单元格显示中会出现特殊性质
由于上文提到的2个与常规的"*"与"?"呈镜像(/手性)对称,因此我称这部分字符为镜像字符
|
|