早期的VB是采用单字节处理方式(通常也称为ANSI方式),也就说一个英文字母用一个字节表示,一个汉字算两个字节,当然这样就可能出现半个汉字的问题。
从VB 4.0起,VB采用了一种新的处理方式,即内部采用Unicode方式,即不论英文字母还是汉字,一律用两个字节表示,但Unicode还不够普及,所以VB只是在其内部完全使用Unicode,而在外部仍转换为人们习惯的ANSI方式,但在字符串处理上与先前的版本有所不同。例如:在中文Windows或英文Windows外挂RichWin 97中,Len("电子&电脑")=5(这里的&号为半角字符),而在以前的版本或纯英文Windows中Len("电子&电脑")=9。除了Len、Left、Right等字符串函数受此影响外,Input函数也受此影响。
Input函数的第一个参数是要读入的字符数,它采用的是和Len一样的计数方式,即一个英文字母算一个字符,而一个汉字(两个字节)算一个字符。这看起来是个好主意,你不会读入半个汉字,但实际上糟透了,因为VB的LOF函数和FileLen函数都返回的是字节数,VB中没有一个能区分汉字和英文字母的LOF函数或FileLen函数!如果你测试文件d:\test1.txt全部是英文,那么你的这段程序可以正确运行,尽管你没有寄来测试文件,但我可以和你打赌,这个文件中有中文。如果你的文件中有100个汉字,那么LOF函数和FileLen函数返回文件长度200个字符,执行Input(200, filenum1),VB读到第100个汉字时就把文件读完了,所以提示错误:"输出超出文件尾"。可能会有人想,把LOF函数和FileLen函数返回文件长度除以2不就行了。是的,如果你的文件中只包括全角字符,那么这么改就对了,但我们平时接触的很多文件都是全角半角混杂的。VB提供了InputB函数,它可以按字节数读入文件,但实际上这个函数有错误,如果你用它读入的文件,那么你得到的可能是象"??????"这样的字符串。我想很多用户都见过这种奇怪的情况。
Line Input语句就没有这个问题,因为它不计数,只看文件中是否有回车和换行,但Line Input语句比Input语句慢得多。怎么解决这个问题呢,我有一个办法不见得好,但可以应急。把Open打开文件的方式由Input改为Binary方式,即:
部分代码:
Open "C:\temp.txt" For Binary As #1
s = StrConv(InputB(LOF(1), #1), vbUnicode)
Close #1
联系客服