【问题标题】:Need to convert text files to Unicode from UTF8 in vbscript需要在 vbscript 中将文本文件从 UTF8 转换为 Unicode
【发布时间】:2013-04-01 03:20:36
【问题描述】:

我在一个文件夹中有一堆文本文件,我需要将编码更改为 Unicode,而不是手动打开文件并将它们保存为 Unicode,我想要一个脚本来执行此操作。

这些文件目前采用 UTF-8 编码,而我极其有限的脚本能力无法弄清楚这一点。我发现下面的代码可以从 ANSI 转换为 Unicode,当我使用此代码时,它确实将其转换为 Unicode,但它会弄乱字符,因此转换实际上不起作用。有什么想法吗?提前致谢。

Set fso = CreateObject("Scripting.FileSystemObject")
Set oFolder = fso.GetFolder("C:\test")
Set oFiles = oFolder.files

For each file in oFiles
If Right(file.Name, 3) = "txt" Then
Set ANSIFile = fso.OpenTextFile(file.path, 1, False, False)
ANSIContent = ANSIFile.ReadAll
Set UNICODEFile = fso.OpenTextFile(file.path, 2, False, True)
UNICODEFile.Write ANSIContent
End If
Next

【问题讨论】:

  • "Unicode" 不是编码,您不能将实际文件更改为“Unicode”。 actual encoding 是什么意思?
  • 如果您打开一个文本文件并选择文件-> 另存为,“编码”选项之一是“Unicode”。如果我要手动执行此任务,我会打开每个文件并将其保存为同一个文件,编码为 Unicode。

标签: text unicode encoding utf-8 vbscript


【解决方案1】:

很遗憾,VBScript 本身不支持这种转换。不过,您可以使用 ADODB.Stream 对象:

Set stream = CreateObject("ADODB.Stream")
stream.Open
stream.Type = 2 'text
stream.Charset = "utf-8"
stream.LoadFromFile "C:\input.txt"
text = stream.ReadText
stream.Close

Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile("C:\output.txt", 2, True, True)
f.Write text
f.Close

或者更精简一点:

Set fso = CreateObject("Scripting.FileSystemObject")

Set stream = CreateObject("ADODB.Stream")
stream.Open
stream.Type = 2 'text
stream.Charset = "utf-8"
stream.LoadFromFile "C:\input.txt"
fso.OpenTextFile("C:\output.txt", 2, True, True).Write stream.ReadText
stream.Close

如果要替换现有文件,则必须使用第一个版本并使用相同的文件进行输入和输出。使用这样的循环遍历文件夹中的所有文件:

Set fso = CreateObject("Scripting.FileSystemObject")
Set stream = CreateObject("ADODB.Stream")

For Each f In fso.GetFolder("C:\source\folder").Files
  stream.Open
  stream.Type = 2 'text
  stream.Charset = "utf-8"
  stream.LoadFromFile f.Path
  text = stream.ReadText
  stream.Close

  fso.OpenTextFile(f.Path, 2, True, True).Write text
Next

【讨论】:

  • 谢谢!这绝对有效,有没有办法对文件夹中的所有文本文件执行此操作并保持相同的名称(或者只是在末尾添加一个字符,如“_U”?
  • @Ekkehard.Horner 我个人对WriteWriteLine 没有偏好。有理由偏爱一个吗?
  • @AnsgarWiechers - .WriteLine 将 EOL 添加到原始(转换后的)内容。运气不好会破坏进一步的处理(在 ReadAll 上拆分,基于行数的计算)或导致系统性增长。此外,它违反了口头禅“.WriteLine .ReadLine; .Write .Read[All]”。
  • 不确定我是否会调用省略 ADO Named Constants"streamlined"
  • adTypeText 未在 VBScript 中定义,我更喜欢保持代码示例紧凑,因此我倾向于避免(重新)定义符号常量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2011-05-31
  • 2021-01-28
  • 2019-06-07
  • 2021-12-28
相关资源
最近更新 更多