Вам нужен поток для чтения и записи, чтобы обе записи и сохранение его в файл работали.
Const adModeReadWrite = 3
Const adTypeText = 2
Const adSaveCreateOverWrite = 2
Sub SaveToFile(text, filename)
With CreateObject("ADODB.Stream")
.Mode = adModeReadWrite
.Type = adTypeText
.Charset = "UTF-16"
.Open
.WriteText text
.SaveToFile filename, adSaveCreateOverWrite
.Close
End With
End Sub
text = Chr(28) & "Hello" & Chr(28)
SaveToFile text, "C:\temp\test.txt"
Другие примечания:
- Мне нравится явно определять с помощью
Const
все константы в коде. Облегчает чтение.
- Блок
With
, сохраняйте довольно много текста здесь.
- Установка типа потока на
adTypeText
на самом деле не нужна, так или иначе это по умолчанию. Но явное лучше, чем неявное, я думаю.
- Установка
Position
в 0 для нового потока является излишней.
- Нет необходимости использовать
ChrW()
для символов диапазона ASCII. Charset
потока определяет ширину байта при сохранении потока в файл. В ОЗУ все в любом случае является Unicode (да, даже в VBScript).
- ADODB.Stream поддерживает две кодировки UTF-16: little-endian
UTF-16LE
(по умолчанию и синоним UTF-16
) и big-endian UTF-16BE
с обратным порядком байтов.
Вы можете достичь того же результата с помощью FileSystemObject и его CreateTextFile()
метода :
Set FSO = CreateObject("Scripting.FileSystemObject")
Sub SaveToFile(text, filename)
' CreateTextFile(filename [, Overwrite [, Unicode]])
With FSO.CreateTextFile(filename, True, True)
.Write text
.Close
End With
End Sub
text = Chr(28) & "Hello" & Chr(28)
SaveToFile text, "C:\temp\test.txt"
Это немного проще, но он предлагает только логический параметр Unicode
, который переключается между UTF-16 и ANSI (не ASCII, как неверно указано в документации!) . Решение с ADODB.Stream
дает вам возможность детального кодирования, например, UTF-8, что невозможно с FileSystemObject.
Для записи существует два способа создания текстового файла в кодировке UTF-8:
- Способ, которым Microsoft нравится это делать, с 3-байтовой меткой порядка байтов (BOM) в начале файла. Большинство, если не все инструменты Microsoft делают это, когда предлагают вариант «UTF-8», ADODB.Stream не является исключением.
- То, как все это делают - без спецификации. Это верно для большинства применений.
Чтобы создать файл UTF-8 с спецификацией, можно использовать первый пример кода выше. Чтобы создать файл UTF-8 без BOM, мы можем использовать два объекта потока:
Const adModeReadWrite = 3
Const adTypeBinary = 1
Const adTypeText = 2
Const adSaveCreateOverWrite = 2
Sub SaveToFile(text, filename)
Dim iStr: Set iStr = CreateObject("ADODB.Stream")
Dim oStr: Set oStr = CreateObject("ADODB.Stream")
' one stream for converting the text to UTF-8 bytes
iStr.Mode = adModeReadWrite
iStr.Type = adTypeText
iStr.Charset = "UTF-8"
iStr.Open
iStr.WriteText text
' one steam to write bytes to a file
oStr.Mode = adModeReadWrite
oStr.Type = adTypeBinary
oStr.Open
' switch first stream to binary mode and skip UTF-8 BOM
iStr.Position = 0
iStr.Type = adTypeBinary
iStr.Position = 3
' write remaining bytes to file and clean up
oStr.Write iStr.Read
oStr.SaveToFile filename, adSaveCreateOverWrite
oStr.Close
iStr.Close
End Sub