VB6 - FileSystemObject Write Error : “invalid procedure call or argument”
2017-12-26 14:16
946 查看
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
用如下解决方法:
但出来的文件变为了一个 unicode 文件,而非 UTF-8 文件。
如直接使用 unicode 方式进行处理,后续会发现其中一些中文会乱码,导致保存至DB后,数据不正确。
最后的发现:
最终确实使用Notepad++ 的Encoding \ Convert to ANSI 后,即可发现有些原为空格的位置,变为了问题"?" 或乱码,将此类记录处理后,即可正常处理了。
最后的最后:
归根结底,还是VB6 的 CreateTextFile 及 File.write 方法太旧,太过时,无法处理新的特殊字符,还是要升级使用 .Net 的处理方法才能从根本上解决问题,而不再担心用户的输入。
补充:
这个问题出现得比较早:在传给印象派的作品描述XML(GBK编码)中一些文字信息经常包含乱码,而且会一乱到底,甚至导致不同页的错乱。刚开始一直都没有什么头绪,不过后来终于发现了部分头绪:GBK的字符集过小,对一些特殊字符的转码会出现乱码—-一些生僻字也就算了,但是其中却包括这个字符:C2A0—-一个在网页上经常使用排版用全角空格。就是这么个字符,用户从网页端拷贝了一段文字,复制到界面上显示正常,保存到作品XML文件中(UTF8编码),显示正常。但是上传作品时由于将相应的XML编码格式转换成GBK,于是出现了乱码……
处理方法:
方法一:转换时对文本信息做特殊处理,用0×20代替掉0xC2A0。
方法二:作品XML文件直接以UTF8编码传输。
方法一有点头疼治头脚疼治脚的味道,虽然解决了这个问题,但是总归不够规范不够完美—-很多页面都是这么做。而方法二则需要服务器支持,但可以完美的解决这个问题。以前服务器之所以用GBK编码很大的理由可能在于GBK相对UTF8更省空间—-在这么个硬盘空间足够,带宽足够的现状下,节约出来的那么点东西又有什么用呢?
[java] view
plain copy
/**
*
* 将不换行空格(NO-BREAK SPACE,Unicode 0x00a0,UTF-8编码:0xC2A0)替换为普通空格。
*
* 用于避免因数据库字符集不兼容导致这个字符变为问号“?”的情况。
*/
public static String nobreakSpaceToSpace(String str) {
if (str == null) {
return null;
}
char nbsp = 0x00a0;
return str.replace(nbsp, ' ');
}
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 的处理方法才能从根本上解决问题,而不再担心用户的输入。
补充:
UTF-8转GBK的悲剧:特殊字符C2A0
这个问题出现得比较早:在传给印象派的作品描述XML(GBK编码)中一些文字信息经常包含乱码,而且会一乱到底,甚至导致不同页的错乱。刚开始一直都没有什么头绪,不过后来终于发现了部分头绪:GBK的字符集过小,对一些特殊字符的转码会出现乱码—-一些生僻字也就算了,但是其中却包括这个字符:C2A0—-一个在网页上经常使用排版用全角空格。就是这么个字符,用户从网页端拷贝了一段文字,复制到界面上显示正常,保存到作品XML文件中(UTF8编码),显示正常。但是上传作品时由于将相应的XML编码格式转换成GBK,于是出现了乱码……处理方法:
方法一:转换时对文本信息做特殊处理,用0×20代替掉0xC2A0。
方法二:作品XML文件直接以UTF8编码传输。
方法一有点头疼治头脚疼治脚的味道,虽然解决了这个问题,但是总归不够规范不够完美—-很多页面都是这么做。而方法二则需要服务器支持,但可以完美的解决这个问题。以前服务器之所以用GBK编码很大的理由可能在于GBK相对UTF8更省空间—-在这么个硬盘空间足够,带宽足够的现状下,节约出来的那么点东西又有什么用呢?
[java] view
plain copy
/**
*
* 将不换行空格(NO-BREAK SPACE,Unicode 0x00a0,UTF-8编码:0xC2A0)替换为普通空格。
*
* 用于避免因数据库字符集不兼容导致这个字符变为问号“?”的情况。
*/
public static String nobreakSpaceToSpace(String str) {
if (str == null) {
return null;
}
char nbsp = 0x00a0;
return str.replace(nbsp, ' ');
}
相关文章推荐
- Invalid_procedure_call_or_argument:_'chr' 解决方法
- Invalid procedure call or argument: 'Chr'
- IE8提示Invalid procedure call or argument 异常的解决方法
- Error:dojo.data.ItemFileWriteStore:Invalid item argument
- Runtime error 5 Invalid procedure call or argument
- Error:dojo.data.ItemFileWriteStore:Invalid item argument
- 某台机器上IE8抛“Invalid procedure call or argument”异常
- error while loading shared libraries:libocci.so.11.1:cannot open shared object file:No such file or
- LinkIssue: Error 'LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or cor
- error while loading shared libraries: libXXX.so.x: cannot open shared object file: No such file or directory .
- 报错libtest: error while loading shared libraries: libuv.so.1: cannot open shared object file: No such file or directory
- 【error】LINK1123: failure during conversion to COFF: file invalid or corrupt
- python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory
- Error: Invalid or corrupt jarfile
- android:error ligGL.so:canot open shared object file:No such file or directory
- Atlas系列一:【已解决】error while loading shared libraries: libcrypto.so.6: cannot open shared object file: No such file or directory
- java -jar xxx.jar命令执行jar包时出现Error: Invalid or corrupt jarfile xxx.jar解决方案
- error while loading shared libraries: libXXX.so.x: cannot open shared object file: No such file or
- error while loading shared libraries: so: cannot open shared object file: No such file or directory