Геон пишет:... Вкратце, был скриншот команды
WScript.Echo('Проверка кодировки русских букв');
набитой в редакторе Notepad++, UTF-8 w/o BOM...
Создал в Notepad++ файл VBS в кодировке UTF-8 без BOM. Ниже пример строки из этого файла и ее hex-представление:
П р и в е т
D0 9F 20 D1 80 20 D0 B8 20 D0 B2 20 D0 B5 20 D1 82
Символы кириллицы представлены 2 байтами, пробел - одним, как и следует для UTF-8. В ходе загрузки данной строки из файла в память WSH рассматривает каждый байт строки как отдельный символ, как если бы кодировка файла была ANSI (значения меньше 128 соответствуют ASCII, а другие интерпретируется в соответствии с региональными настройками). То есть, вместо преобразования D0 9F в символ "П", получается преобразование D0 в "Р" и 9F в "џ". В итоге, переменная в памяти содержит строку:
Рџ СЂ Рё РІ Рµ С‚
20 04 5F 04 20 00 21 04 02 04 20 00 20 04 51 04 20 00 20 04 06 04 20 00 20 04 B5 00 20 00 21 04 1A 20
Именно эта строка и показывается у меня в окне сообщения WScript.Echo. Выполнив обратные преобразования, WScript.Echo вновь стал показывать "П р и в е т" вместо "Рџ СЂ Рё РІ Рµ С‚":
s = "П р и в е т"
WScript.Echo s ' Рџ СЂ Рё РІ Рµ С‚
r = ""
For p = 1 To Len(s)
r = r & ChrB(Asc(Mid(s, p, 1)))
Next
With CreateObject("ADODB.Stream")
.Type = 2
.Mode = 3
.Charset = "Unicode"
.Open
.WriteText r
.Position = 0
.Charset = "UTF-8"
r = .ReadText
.Close
End With
Do While LeftB(r, 2) = ChrB(&HFD) & ChrB(&HFF)
r = MidB(r, 3)
Loop
WScript.Echo r ' П р и в е т
Цикл For..Next преобразует каждый символ исходной переменной в байт в соответствии с региональными настройками, и соединяет эти байты в строку UTF-8. Далее с помощью Stream строка преобразуется из UTF-8 в Unicode, "понятный" строковым переменным. Цикл Do..Loop отрезает 2 символа замены FD FF FD FF, появляющиеся в начале строки на Win7 x64, что свидетельствует об ошибке, хотя искажения строки и нет. На виртуалке же WinXP x86 они не появляются.
Критичное место в цепочке преобразования - обеспечение одинаковых региональных настроек для процесса WSH в момент загрузки файла, и в ходе работы первого цикла For..Next, использующего Asc() для обратного преобразования. В моем случае, если перед циклом добавить SetLocale(), отличный от 1049, скрипт выдает ошибку 80070057 на .ReadText.
Для адаптации данного преобразования под JS необходимо найти альтернативу функциям ChrB(), MidB() и LeftB().
Геон пишет:... либо альтернативные команды отображения такого всплывающего окошка.
Подобные запросы более продвинутого GUI для WSH уже были, вот пример.
Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251