今天在做一个程序的测验,用instr函数查询字串中某一个字串的位置,发生一个比较有趣的事情,或许真是微软的bug?
首先介绍下instr这个函数
返回 Variant (Long),指定一字符串在另一字符串中最先出现的位置。
语法
InStr([start, ]string1, string2[, compare])
InStr 函数的语法具有下面的参数:
部分 说明
start 可选参数。为数值表达式,设置每次搜索的起点。如果省略,将从第一个字符的位置开始。如果 start 包含 Null,将发生错误。如果指定了 compare 参数,则一定要有 start 参数。
string1 必要参数。接受搜索的字符串表达式。
string2 必要参数。被搜索的字符串表达式。
Compare 可选参数。指定字符串比较。如果 compare 是 Null,将发生错误。如果省略 compare,Option Compare 的设置将决定比较的类型。
设置
compare 参数设置为:
常数 值 描述
vbUseCompareOption -1 使用Option Compare 语句设置执行一个比较。
vbBinaryCompare 0 执行一个二进制比较。
vbTextCompare 1 执行一个按照原文的比较。
vbDatabaseCompare 2 仅适用于Microsoft Access,执行一个基于数据库中信息的比较。
返回值
如果 InStr返回
string1 为零长度 0
string1 为 Null Null
string2 为零长度 Start
string2 为 Null Null
string2 找不到 0
在 string1 中找到string2 找到的位置
start > string2 0
说明
InStrB 函数作用于包含在字符串中的字节数据。所以 InStrB 返回的是字节位置,而不是字符位置。
那么利用这个函数来举一个例子
s= InStr(1, “天天向上Shi”, “Shi”, 1)
x= len( “天天向上Shi”)
instr查询的字符的位置,那么这里s应当为5,x为7
现在我们换一个句子
s= InStr(1, “べ天向上Shi”, “Shi”, 1)
x= len( “べ天向上Shi”)
s=5?
x=7?
是的,x依然是7,但是这时候s的值却为6,也就是说instr函数在这里把べ当成了2个字符,并且把S的位置向后增加了一位。继续测验
我尝试用instrB函数来测验
s= InStrB(1, “べ天向上Shi”, “Shi”, 1)
x= lenB( “べ天向上Shi”)
s= InStrB(1, “天天向上Shi”, “Shi”, 1)
x= lenB( “天天向上Shi”)
得出的结果是2个s和x的值都分别相同,并没有出现前面的不相等情况。
我从google输入“べ”这个字符,结果跳出了这样一个组合“べネックス”,好像是日本语,继续按照上面方法测试,发现其它几个字符“ネックス”并没有出现“べ”的情况。
看来instr只对”べ”情有独钟,对别的都是一视同仁。
instr的这个“爱好”导致我的程序没有办法在含有“べ”的字串中准确判断其他字串的真实位置。
这是instr的个人爱好吗?instr仅仅对”べ”敢兴趣吗?还是文字的编码问题?我在编写文章的时候发现在中文状态下双引号在它后面的状态都很奇怪,既不是英文的,也不是中文的,俺又做了一个测验
“ff”
“dd”
”べ”
“方法”
ff是在中文状态下输入的,dd是英文状态下输入的,下面2个是在中文状态下输入的,
べ后面的那个引号是自动切换到了日本语下的状态?
不管怎样,这个字符”べ”有点奇怪,instr函数有点搞怪,难道这就是巴格(bug)?
其实上面这个现象就是文本比较和二进制比较的区别。用二进制比较就将不会出现这个情况。