【问题标题】:VBS Scripting.FileSystemObject Need help writing ANSI txt FileVBS Scripting.FileSystemObject 需要帮助编写 ANSI txt 文件
【发布时间】:2015-01-21 18:55:17
【问题描述】:

我正在尝试创建一个 ANSI 文件。但我尝试的一切都给了我一个 UTF-8 w/o BOM。

为了测试目的,我尝试用最少的代码来做到这一点,这就是我发现的。

 Dim myFile 
 Dim objFSO : Set objFSO=CreateObject("Scripting.FileSystemObject")
 Set myFile = objFSO.CreateTextFile("C:\TestFile.txt")
 myFile.Close

上面的代码给了我一个 MSDS 宣传的 ANSI 文件,但是当我在下面的代码中写入它时

 Dim myFile 
 Dim objFSO : Set objFSO=CreateObject("Scripting.FileSystemObject")
 Set myFile = objFSO.CreateTextFile("C:\TestFile.txt")
 myFile.WriteLine "TestLine"
 myFile.Close

现在使用 Notepad++ 检查文件时,我有 UTC-8 w/o BOM

有代码等待我尝试创建的实际文件。该代码不接受该文件。经过一些繁琐的调试后,我发现它不喜欢 UTF 格式。如果我现在使用 Notepad++ 保存为 ANSI,代码将接受该文件。我需要从一开始就以编程方式执行此操作。

谁能确认他们是否得到相同的结果? 如何确保最终得到一个 ANSI 文本文件? 谢谢

【问题讨论】:

  • 我正在使用 notepad++ 打开生成的文件。我正在创建的实际文件存在依赖关系,它不喜欢 UTF 格式。如果我使用 notepad++ 将文件转换为 ANSI,则代码接受该文件。如果你愿意,我可以放截图
  • 你将什么 .WriteLine(而不是“TestLine”)写入 myFile?您是否在“真实”代码中使用“On Error Resume Next”?
  • 我正在创建的文件包含来自不同测试站的其他文件名。结果文件的名称上有度数和各种工程符号等符号。我正在两个系统之间编写一个接口。我看不到接收端的代码,但经过测试,我发现当文件格式为 UTF 时,如使用 Notepad++ 所示,它将拒绝该文件。如果我将相同的文件转换为 ANSI 并重新尝试将其提供给接收系统,它会完美运行。我需要文件是 ANSI 并且上面有工程术语。

标签: utf-8 vbscript com ansi


【解决方案1】:

常用语法:object.CreateTextFile(filename[, overwrite[, unicode]])。这里

  • 覆盖: 可选的。指示您是否可以覆盖现有文件的布尔值。如果文件可以被覆盖,则值为true,如果不能被覆盖,则值为false。如果省略,则不会覆盖现有文件。 注意:如果 overwrite 参数是false,或者没有提供,对于已经存在的文件名,会发生错误。李>
  • unicode: 可选的。指示文件是作为 Unicode 文件还是 ASCII 文件创建的布尔值。如果文件创建为 Unicode 文件,则值为 true,如果文件创建为 ASCII 文件,则值为 false如果省略,则假定为 ASCII 文件。 (但最后的陈述似乎与您的经验相矛盾...)

所以你可以用

打开你的文件
Set myFile = objFSO.CreateTextFile("C:\TestFile.txt", true, false)

如果失败,使用object.OpenTextFile(filename[, iomode[, create[, format]]]),其中

  • 对象:必需。 Object 始终是 FileSystemObject 的名称。
  • 文件名:必需。标识文件的字符串表达式 打开。
  • iomode:可选。可以是三个常量之一:ForReading, ForWriting,或ForAppending
  • 创建:可选。布尔值,指示新文件是否可以 如果指定的文件名不存在,则创建。值为True 如果创建了新文件,则 False 如果未创建。如果省略,则 未创建新文件。
  • 格式:可选。三个TriState 值之一,用于指示 打开文件的格式。如果省略,则文件以 ASCII 格式打开。

您可以为 iomodecreateformat 参数使用文字值,或者定义(和使用)下一个常量:

'various useful constants
'iomode
Const ForReading = 1, ForWriting = 2, ForAppending = 8
'create
Const DontCreate =  False ' do not create a new file if doesn't exist
Const CreateFile =  True  ' create a new file if the specified filename doesn't exist
'format
Const OpenAsDefault = -2  ' Opens the file using the system default.
Const OpenAsUnicode = -1  ' Opens the file as Unicode.
Const OpenAsUSAscii =  0  ' Opens the file as ASCII.

'TriState (seen in documetation)
Const TristateUseDefault  = -2 ' Opens the file using the system default.
Const TristateTrue        = -1 ' Opens the file as Unicode.
Const TristateFalse       =  0 ' Opens the file as ASCII.

然后你可以打开你的文件(但如果存在,请确保删除现有的文件!)

Set myFile = objFSO.OpenTextFile( "C:\TestFile.txt", 2, true, 0)

或(更易读)

Set myFile = objFSO.OpenTextFile( "C:\TestFile.txt" _
             , ForWriting, CreateFile, OpenAsUSAscii)

【讨论】:

  • 感谢您抽出宝贵时间回复。我尝试了这段代码,但不幸的是由于某种原因。当我使用 WriteLine 方法时,文件被转换为 UTF。只要我不使用 WriteLine 方法写入文件,文件就会保持 ANSI。