||
前面写了个拆分配方文本的工具,测试中同事反映了有几个配方不能正常解析,文本复制到Word中再复制到Excel里面就可以正常解析。很是奇怪。
我把文本拿来研究了一下,发现了一个现象:配方文本看起来是完全正常的,格式也符合要求,但解析的时候反馈“各样式不一致”。我的第一反映就是可能这里面有一些不可见的特殊字符干扰了正则表达式的解析。调试时果然发现,鼠标移到字串变量边上,显示的字串中在数值前面有一个可疑的问号。说明这里有一个不能显示的特殊字符。
于是再把文本复制到EditPlus中,切换到Hex Viewer模式,这个特殊字符显示是C2 A0,当时编辑器使用的是UTF-8编码。我查下了,无论是C2 A0还是A0 C2都有编码,不像是这种特殊字符,应当不是这个原因。当时忘记了手工解析一下这个字符的码值,导致走了几步弯路。
把这个特殊字符复制粘贴到一个字串s,再用Msgbox ascw(s)显示这个字符的编码,结果是160. 显然这是一个十进制,打开Windows的计算器算了一下,Hex值为A0。 再查Unicode 13标准中,码值为A0的是特殊字符NBSP
NBSP,是码值在255之内的特殊字符,是不换行的空格。以前在处理SCIfinder中的文本时碰到过一个难解的零宽度空格(ZWSP),码值为0x200B,当时还专门博文讨论过。今天又碰到一个特殊空格NBSP。都是这种特殊空格惹的祸。普通的空格,其码值是0x20,比较常见也容易想到,与这些特殊空格不是一回事。
再翻看之前学习的UTF-8的编码,看看UTF-8编码下的 C2 A0,它的码值是多少?用计算器算了一下
C2 A0 对应的二进制分别是 1100 0010,1010 0000.
根据之前总结的Unicode码值为0x80~0x7FF的, 编码为两个字节,形式是
110xxxxx 10xxxxxx.
将模板中的110 和 10 去掉。 1100 0010,1010 0000 (红字为编码带来的字节) ,再组合剩下的 灰色的字节,从后往前重新按8位一个字节划分,不足的高位补0,形成二个字节,就是 00000000 10100000,前面的字节值为0, 可以忽略,后面的字节码值正是A0。
通过拆解我明白了,码值为A0的字符,刚巧它在在UTF-8编码下就是C2 A0。这也是我疑惑了很久这个C2代表的是什么字符的原因。
那既然知道这个字符就是特殊字符,我用正则表达式查一下看看,果然能够查到一个字串有还有好几个。你注意左下角的查找框中的表达式。与零宽度空格不同的是,这种NBSP是有显示宽度的,图上看得真切。
知道了原理,清理掉这种空格就简单了,正好用到了一个清理文本的函数,考虑了一些全角字符的替换与全角空格的清理,在其中增加当字符为chrw(160),chrw(8203)的情况(对应NBSP,ZBSP的十进制值),这两个字符就除掉了,解析恢复了正常。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-23 10:02
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社