如何在VBScript中读取UTF-8文本文件

34
我有一个以UTF-8格式保存的文本文件,但当我尝试读取该文件时,它显示的是奇怪的字符,而不是正确的字符(其中包含中文字符)。我该如何使其显示正确的中文字符呢?
Option Explicit

Dim objFSO, strTextFile, strData, strLine, arrLines, aniTextFile, aniData, aniLines, aniLine, objTextFile, fso, inputFileList, listFile, fname
Dim iim1, iret, iret2, iret3, i
Const ForReading   = 1

Set objFSO = CreateObject("Scripting.FileSystemObject")
strTextFile = "C:\Users\admin\Desktop\ArtistCG\folder.txt"
strData = objFSO.OpenTextFile(strTextFile,ForReading).ReadAll
arrLines = Split(strData,vbCrLf)

aniTextFile = "C:\Users\admin\Desktop\ArtistCG\folder-list.txt"
aniData = objFSO.OpenTextFile(aniTextFile,ForReading).ReadAll
aniLines = Split(aniData,vbCrLf)

For i = 0 To UBound(arrLines)
  strData = objFSO.OpenTextFile(arrLines(i),ForReading).ReadAll
  WScript.Echo strData

  Set listFile = objFSO.OpenTextFile(aniLines(i),ForReading)
  Do While Not listFile.AtEndOfStream
    fName = listFile.ReadLine
    WScript.Echo fName
  Loop
  listFile.Close
Next 
2个回答

64

从文档中得知:

FSO只能读取ASCII文本文件。您不能使用FSO读取Unicode文件或读取二进制文件格式,例如Microsoft Word或Microsoft Excel。

由于出现了奇怪的字符,我猜这有些不正确,而是以某种8位Windows代码页读取了该文件,因为如果它真的只能读取ASCII,你将会看到????

无论如何,如果您可以使用ADO,您可以这样做:

Dim objStream, strData

Set objStream = CreateObject("ADODB.Stream")

objStream.CharSet = "utf-8"
objStream.Open
objStream.LoadFromFile("C:\Users\admin\Desktop\ArtistCG\folder.txt")

strData = objStream.ReadText()

objStream.Close
Set objStream = Nothing

2
哈哈,FSO确实无法读取UTF-8,但MSDN文档中关于Unicode和二进制文件的描述让我感到好笑。 - Panayot Karabakalov
3
在使用 objStream.ReadText() 方法后不要忘记调用 objStream.Close() - Olexa
3
虽然 FSO 不能读取 UTF-8,但实际上你可以用 FSO 将文件以 ASCII 格式打开,并且 通过循环逐个字符读取内容,然后将这些字符序列转换为字符串 将每个字符视为 UTF-8 编码文件的一个字节。这只是一种学术兴趣;ADODB.Stream 明显更加高效。 - omegastripes
2
“FSO只能读取ASCII文本文件”这种说法是不正确的 - FileSystemObject可以读取UTF-16文件,但不能读取UTF-8文件,请参考@Ekkehard.Horner在user2171987的回答中的评论。 - Daz
objStream.ReadText() 不起作用。 - fsalazar_sch

-6

你可以使用文件系统对象,并在其中加入 True 参数,以读取 UTF 8 格式的文件。

sFile = "C:\Users\admin\Desktop\ArtistCG\folder.txt"
Set FS = CreateObject("scripting.filesystemobject")
Set oReadfile = FS.OpenTextFile(sFile, 1, False, True)
TextFromFile = sReadfile.ReadAll

14
-0.99中的.OpenTextFile()函数的第四个参数可以是三态值,用来打开一个文本文件,并指定使用系统默认编码(-2)、UTF-16编码(-1),或者 ASCII编码(0),但是不支持UTF-8编码。请注意保持原意,使翻译更通俗易懂,切勿添加解释或其他内容。 - Ekkehard.Horner
2
这个评论帮助我最终弄清楚了如何读取一个我一直在尝试修改的UTF-16 LE ini文件。我可以在写入时将文件保存为UTF-16 LE,但需要在读取函数中添加第四个参数-1(TristateTrue),以便正确找到要修改的设置。谢谢。 - Supernatix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接