汉语史文本处理中,四字节汉字基本是无法绕过的问题,同时Excel又是最适合处理结构化文本的平台,字符串判断、切分等经常会遇到四字节汉字,因此这里对Excel环境下的四字节汉字处理问题做一点小的整理。
汉字编码与四字节汉字
Unicode标准下普通汉字采用2字节编码,但由于2字节(16位)编码方案最多只有216=65535个码位,无法容纳更多字符。所以Unicode标准对编码方案进行了扩容,使用了一种叫做代理项对的技术对65535个以外的的字符进行了编码。所谓代理项,就是使用两个2字节编码组合成一个新的编码,用以表示一个新的字符。
具体来说,一个2字节汉字,比如“中”的Unicode编码是 4E2D(16进制);而一个四字节汉字则使用两个 2字节编码合成一个新的编码,比如𣐎字(木+瓦,左右结构),unicode内码是2340E(亦为16进制,下同),在存储的时候,其实是分成两块的,两块各相当于一个2字节的汉字,第一块的编码是D84D,第二块是DC0E,这两个分别叫做低端代理和高端代理,通过Unicode规定的一个函数,可以将这两个代理计算转换为一个4字节的unicode编码,即2340E。
所以,实际上在文本的存储结构中,一个四字节汉字相当于两个2字节汉字并列,比如“中国?字”这个字符串,存储结构如下:
中 | 国 | 𣐎 | 字 |
---|---|---|---|
4E2D | 56FD | D84D DC0E | 5B57 |
许多对unicode支持不好的软件,会将一个四字节汉字看成2个二字节汉字,以上四个字做字数统计的时候,会被当成5个字符。目前,微软Excel vba截止2007版对汉字的基本计量单位是2字节,即2字节看做一个汉字,因此一个四字节汉字会被看成两个独立的汉字,如果使用字符串截取函数对以上字符串进行截取,而截取的起点刚好是四字节汉字的第二块,那么很遗憾,一个四字节字会被切成两个字,而这两个编码是没有对应字符的,表现出来就是,显示的时候是两个空白字符。
Excel VBA中四字节汉字的判断与处理方案
出于以上原因,我们在Excel Vba中对汉语史文本进行计数、截取时,必须对四字节汉字进行单独判断、处理。前几年尉迟老师已经找到了判断四字节汉字的方法,这里我提供一个四字节判断的函数,方便编程时引用:
1 | '四字节判断函数 |
说明:对字符串进行遍历时,每次取一个字符(2字节),作为参数zi传给函数is4(),进行判断,如果为四字节,则返回True,如果为二字节,则返回False。根据返回值,可知指针所在位置的字符是否为4字节,如果为4字节,则继续向前取一个字符,将其和当前字符合并,即可合成一个完整的4字节汉字,操作完成之后循环变量记得+1;如果为2字节汉字,正常继续遍历即可。