VB6 中使用以下方式读取一个 UTF-8 文件后,另存为一个新文件时出错 “invalid procedure call or argument”
‘ 读取
Dim adoS As Object
Set adoS = CreateObject("adodb.stream")
With adoS
.Charset = "utf-8"
.Type = 2
.Open
.LoadFromFile sUTF8File
ReadUTF8 = .ReadText
.Close
End With
’ 另存文件
Dim fso As New FileSystemObject
Dim txtFile As TextStream
Set txtFile = fso.CreateTextFile(sFile,True)
txtFile.Write (strContent)
txtFile.Close
一个临时解决方法:
1,将 txt中的内容Copy至Word中
2,在Word中所有所有文字,使用转半角功能(Aa 图标下: Change Case \ Half-width),对文字进行半角转换
3,再从Word文件中将转换后的文字Copy至原 txt 文件中,保存
再次上传即可成功
另一个解决方法:
不使用另存文件,而直接使用读取到的 String ,将字串转为数据,然后再对数据进行处理。
Dim oarrLine() As String
oarrLine = Split(ReadUTF8,vbCrLf)
真正的原因:
为何会出错,真正的原因可能是因为文件内容有一些特别的字符,导致写文件时错误。如下示例:
https://stackoverflow.com/questions/17094281/getting-invalid-procedure-call-or-argument-in-vbscript
用如下解决方法:
>> f.close >> Set f = goFS.CreateTextFile(".\tmp.txt",True,True) ' overwrite,unicode >> f.WriteLine ChrW(&H1F00) >> >> --- no news are good news --但出来的文件变为了一个 unicode 文件,而非 UTF-8 文件。
如直接使用 unicode 方式进行处理,后续会发现其中一些中文会乱码,导致保存至DB后,数据不正确。
最后的发现:
最终确实使用Notepad++ 的Encoding \ Convert to ANSI 后,即可发现有些原为空格的位置,变为了问题"?" 或乱码,将此类记录处理后,即可正常处理了。
最后的最后:
归根结底,还是VB6 的 CreateTextFile 及 File.write 方法太旧,太过时,无法处理新的特殊字符,还是要升级使用 .Net 的处理方法才能从根本上解决问题,而不再担心用户的输入。
补充: