Как создать файл UTF-16 в VBScript? - PullRequest
0 голосов
/ 15 сентября 2018

Моя система - Window 10 English-US. Мне нужно написать некоторые непечатные символы ASCII в текстовый файл. Например, для значения ASCII, равного 28, я хочу записать \ u001Cw в файл. Мне не нужно делать ничего особенного, когда я пишу код на Java. Ниже мой код в VBS

Dim objStream
Set objStream = CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = 2
objStream.Position = 0
objStream.CharSet = "utf-16"

objStream.WriteText ChrW(28)  'Need this to appear as \u001Cw in the output file

objStream.SaveToFile "C:\temp\test.txt", 2
objStream.Close

1 Ответ

0 голосов
/ 15 сентября 2018

Вам нужен поток для чтения и записи, чтобы обе записи и сохранение его в файл работали.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...