1 (изменено: Turka0009, 2010-11-07 12:56:25)

Тема: VBS: читаем русский текст

Здраствуйте почему скрипт не читает русский?

start = "c:\temp\1.txt"
Set fso = CreateObject("scripting.filesystemobject")
Set textstream = fso.opentextfile(start, 1, true, 0)
msgbox textstream.readall()

содержание файла c:\temp\1.txt :
Привет всем
бла бла бла

а выдает различные символы...
пробую записывать в тесктовой файл:

start = "c:\temp\1.txt"
fin = "c:\temp\2.txt"
Set fso = CreateObject("scripting.filesystemobject")
Set textstream = fso.opentextfile(start, 1, true, 0)
set twrite = fso.opentextfile(fin, 2, true, 0)
twrite.write textstream.readall()

и во втором файле получаем :


㈱㈰〳ㄳ㐱〳ㄷ㘰〵㠶㈱ㄳ〶㘰ㄵ〱㘰ㄸ㘵㘱〱㐶㌱〱㌷㘱〰㐶㌱〱㌷㘱〰㐶㌱〱㌷㘱ㄱПривет всем
бла бла бла




Как исправить баг?

2

Re: VBS: читаем русский текст

Вам знакомы термины «кодировка», «OEM», «ANSI», «UTF-8», «UTF-16»? Это как раз Ваш случай. Упакуйте Ваш текстовый файл в архив и выложите куда-нибудь на обменник, ссылку, оформленную тэгом «url» — сюда.

OFF: Смотреть/перебирать/определять кодировку текстового файла «на глаз» удобно с помощью «Far Manager»'a.

3 (изменено: Turka0009, 2010-11-07 13:35:27)

Re: VBS: читаем русский текст

с системами кодировки я знаком, файл в кодировке unicode (не Big Endian).
http://informan.moy.su/1.txt
http://narod.ru/disk/27107134000/1.rar.html

4

Re: VBS: читаем русский текст

Если Юникод, то нужно так:

Set textstream = fso.opentextfile(start, 1, true, -1)

Кстати, Big Endian вроде без проблем читается.

5

Re: VBS: читаем русский текст

ммм... у меня нет результата, а есть еще способы записи и чтение текста из файлов?

6

Re: VBS: читаем русский текст

Приведите Ваш код, и расскажите, что Вы хотели получить с его помощью. У меня нормально читается и точно так же пишется:

Option Explicit

' IOMode Enum
Const ForReading   = 1
Const ForWriting   = 2
Const ForAppending = 8

' Format Enum
Const TristateUseDefault = -2
Const TristateTrue       = -1
Const TristateFalse      =  0


Dim objFSO
Dim objTSIn, objTSOutANSI, objTSOutUTF16

Dim strLine


Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

Set objTSIn       = objFSO.OpenTextFile("C:\Downloads\1.txt", ForReading, False, TristateTrue)
Set objTSOutANSI  = objFSO.OpenTextFile("C:\Downloads\ANSI.txt", ForWriting, True, TristateFalse)
Set objTSOutUTF16 = objFSO.OpenTextFile("C:\Downloads\UTF16.txt", ForWriting, True, TristateTrue)

Do Until objTSIn.AtEndOfStream
    strLine = objTSIn.ReadLine
    WScript.Echo strLine
    
    objTSOutANSI.WriteLine strLine
    objTSOutUTF16.WriteLine strLine
Loop

objTSIn.Close
objTSOutANSI.Close
objTSOutUTF16.Close

Set objTSOutUTF16  = Nothing
Set objTSOutANSI   = Nothing
Set objTSIn        = Nothing

Set objFSO = Nothing

WScript.Quit 0

7

Re: VBS: читаем русский текст

Прошу прощения может ответ недоглядел на форуме, а проблема у меня в этих кодировках "с самого начала..."

Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP")
oXMLHTTP.Open "GET","http://vadi-ks.narod.ru/201101-446848/results.log",False
oXMLHTTP.setRequestHeader "Content-Type", "text/html; charset=windows-1251" 'казалось мне вот же она кириллица((
oXMLHTTP.Send
msgbox oXMLHTTP.responseText

Запускаю этот vbs-скрипт, вместо русских букв - квадратики
Текст с текстового файла results.log:

results January 2011:
...
//Да здравствует русский текст!!!

Стремление - залог успеха

8

Re: VBS: читаем русский текст

Ключевые слова для поиска: «Xameleon» и «кодировк*».

Дело в том, что объект «XMLHTTPRequest» всегда возвращает текст по «.responseText()» в кодировке UTF-8 [я встречал на RSDN упоминания о том, что, дескать, можно сие поведение поменять, указав в методе «.Send()» xml с нужной кодировкой — увы, у меня такое не сработало].

Коллега Xameleon рекомендовал просто конвертировать полученное содержимое из массива байт, получаемого по «.responseBody()», в правильную кодировку посредством «ADODB.Stream»:

Option Explicit

Dim arrContents
Dim strContents

With WScript.CreateObject("Microsoft.XMLHTTP")
    .open "Get", "http://vadi-ks.narod.ru/201101-446848/results.log", False
    .send
    
    arrContents = .responseBody
End With

With WScript.CreateObject("ADODB.Stream")
    .Type = 1
    .Open
    .Write arrContents
    
    .Position = 0
    .Type = 2
    .Charset = "windows-1251"
    
    strContents = .ReadText
End With

WScript.Echo strContents

WScript.Quit 0

Вы тоже были участником того обсуждения . К сожалению, [пишу сейчас о себе] не всегда сразу понимаешь ценность той или иной идеи, пока в ней не возникнет реальная потребность.

9

Re: VBS: читаем русский текст

Дело в том, что объект «XMLHTTPRequest» всегда возвращает текст по «.responseText()» в кодировке UTF-8 [я встречал на RSDN упоминания о том, что, дескать, можно сие поведение поменять, указав в методе «.Send()» xml с нужной кодировкой — увы, у меня такое не сработало].

Указание допустимой кодировки в заголовке запроса не помогает? Реального ответа не знаю - только теоретически предполагаю

oXMLHTTP.setRequestHeader "Accept-Charset", "windows-1251"
oXMLHTTP.setRequestHeader "Accept-Language", "ru"
( 2 * b ) || ! ( 2 * b )

10

Re: VBS: читаем русский текст

2Rumata: к сожалению, нет:

results January 2011:
...
//? ????????

Я сам столкнулся с подобной проблемой всего пару дней назад, пытаясь делать загрузку содержимого из сети и локальный разбор html посредством объекта «htmlfile» на примере самого «http://forum.script-coding.com». Тогда начал копать и наткнулся на RSDN (которое не сработало) и это самое недавнее обсуждение, которое помогло.

11

Re: VBS: читаем русский текст

Спасибо вам, коллеги! Значит буду конвертировать посредством «ADODB.Stream».

alexii пишет:

К сожалению, ... не всегда сразу понимаешь ценность той или иной идеи, пока в ней не возникнет реальная потребность.

Да, это факт.

Стремление - залог успеха