|
楼主 |
发表于 2018-2-19 10:27
|
显示全部楼层
本帖最后由 流浪铁匠 于 2018-2-19 11:09 编辑
char 特性: 1,取整;2,有盲区
1,取整:char函数内的参数,函数帮助介绍是1-255,但实际测试下来最大值为65535
而且作为参数的正数具有自动取整性,参数具有小数时会自动取整识别
2,盲区: 称为盲区,是因为在1-65535范围内,char函数并不能产生65535个字符,遍历测试下来为32766个
即1-65535范围内不到一半的数字有对应的ANSI字符
但至少远远超过函数帮助介绍中的1-255范围
而且,即便是这3万多个字符,用code获取的对应数字,也不能一 一 对应:
因为这个性质,故视为这个函数的转化范围是存在盲区的
测试确定char的准确取值范围是1-255和33025-65535两组,而中间间断的256-33024范围即为盲区
以下为探索中发现的5组 code和char不能对应 一 一 转化的特殊字符系列
不对应字符系列1——空格型
char(32)和char(129-254)这127个字符,对应的code/unicode值均为32(空格的代码),且均能用trim和substitute+char(32) 清除
以上为仅用char和code函数就可以发现的不完全对应的字符
由于早期版本函数缺失,借助2013版新增的unichar和unicode函数,对于字符的对照,有了新的发现,如下所述
不对应字符系列2——估计是大家最熟悉的不可见字符类型,所谓的char(63)
本文的重点也是这个
由于unichar/unicode这对函数在2013版才出现
早期版本由于无法深究这个(类)字符,之前看过几位前辈的帖子,也有介绍过这个字符,结论基本是对于code值为63的不可见字符,推荐使用替换大法处理
因为
在我的2016版(默认语言中文),一共有1087896个数字使用unichar函数获取的字符,用code获取的数字代码是63 !!!
疑似是因为Excel把所有无法用code识别的字符均默认为"?",而"?"的code值即为63的原因
即,在excel内,有100+万个字符对应的code值为63
有意思的是,在别人建议下,我把默认语言改为英文后,结果如下
即在不同语言环境下,结果出现差异的函数不仅仅只有lenb/leftb这种
这类字符转化函数同样存在该问题
无论结果是哪个,都说明了,在excel内,code函数都会将当前环境下无法识别的字符的对应代码产生为63
而且总数在100+万个以上,因为这100万+个字符本身并不一样,当然无法直接使用substitute+char(63)清除
而同样遍历测试,excel内unicode字符集共计可产生1111997个字符
code值为63的字符占unicode字符总数的97.83% (1087896/1111997)
在我看来,code值为63的不可见字符相对其他不可见字符难以处理的原因就在这里
纯函数解法,必须先知道这个字符究竟是这100万+个字符中的哪一个,2013版可以用unicode直接确定
但早期版本没有unicode,而code的结果只会返回63,误导了很多人,这也是为什么推荐替换大法的原因,直接有效(少量字符在编辑栏内宽度疑似0,无法直接使用替换方式处理,要先粘在word或记事本现原形)
在这100多万个字符中,提一个比较出名的:在unichar(1-255)范围内,有1个unichar(160) 是不可见的,code值也是63,
而且,这是我在微软函数帮助内唯一发现被介绍的特殊字符(trim函数介绍内),被称为"不间断空格字符",常见于网页
不对应字符系列3——很多人不知道的char(0)
和char(63)一个意思,指的是该字符用code获取的数字结果为0
这类字符一共发现31个,是之前遍历测试时发现的,为unichar(129-159)合计31个unicode字符
直接 =char(0) 是返回错误值的,所以这组字符也是有意思的一组,因为0不在char的数据范围内,但code的结果可以产生
由于这31个(不可见)字符均可使用clean直接清除,所以很多人可能不知道其存在
不对应字符系列4——char(128)
code值在1-255之间的字符遍历统计,除了上述,有2组挺有意思
unicode字符集中有2个字符对应的code值均为128(unichar(128)和unichar(8364)),
而且有意思的是,这2个字符,1个可见,1个不可见,由于unichar(8364)是可见的,这是最不需要关注的一组特殊字符
不对应字符系列5——继char(63)后的最大发现:char(255)
和系列4一样,unicode字符集中有2个字符对应的code值均为255(unichar(255)和unichar(63733)),而且也是一个可见,一个不可见
但在char对应的ANSI字符集内,char(255)和char(65280-65535)合计257个字符,用code值获取的结果均为255
而char(65280-65535)这256个字符用unicode获取的结果均为63733,且均为不可见的
和code值为63的不可见字符性质一样,无法使用clean/trim/substitute+char(255)等方式清除!!!
测试后只能使用substitute+unichar(63733)的方式清除,也是一组有意思的字符
以上是对code值在0-255之前的字符利用公式遍历测试发现的一些特殊字符
足以表明,char和code函数是无法完全相互转化的,部分字符的识别有很大差异
而且,unicode字符集代码为32/63733这2种情况下char产生的字符和unicode也不是一一对应了,
此时使用char函数产生的字符和unicode字符代码对比是多对一的关系
|
评分
-
1
查看全部评分
-
|