Проблема с кодировкой в перенаправлении вывода

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Vova_2581
Постоялец
Постоялец
 
Сообщения: 362
Зарегистрирован: 10.01.2010 (Вс) 18:08

Проблема с кодировкой в перенаправлении вывода

Сообщение Vova_2581 » 08.09.2019 (Вс) 20:46

Выполняю команду ipconfig /all через объектную модель WSH с перенаправлением вывода, к примеру, сразу на форму... можно в Text... не важно, результат тот же. На XP не было никаких проблем, и этот код работал, а вот на 7-ке почему-то крякозябры вместо кириллицы. Пробовал конвертировать в Unicode - Print StrConv(ResultStr, vbUnicode) – бестолку. Что не так??? Как вернуть кириллицу???
Код: Выделить всё
Private Sub Command1_Click()
Dim objShell, objCmdExec
cmdstr = "ipconfig /all"
Set objShell = CreateObject("WScript.Shell")
Set objCmdExec = objShell.Exec(cmdstr)
ResultStr = objCmdExec.StdOut.ReadAll
Print ResultStr
'Print StrConv(ResultStr, vbUnicode)
Set objShell = Nothing
Set objCmdExec = Nothing
End Sub

Вот, что выходит...
Screen1.jpg
Screen1.jpg (32.1 Кб) Просмотров: 3921

А в самом командном процессоре все ок...
Screen2.jpg
Screen2.jpg (50.71 Кб) Просмотров: 3921

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Проблема с кодировкой в перенаправлении вывода

Сообщение ALX_2002 » 08.09.2019 (Вс) 21:28

Код: Выделить всё
Option Explicit
Sub Main()
    Dim objWshShell As New IWshRuntimeLibrary.WshShell
    Dim objWshExec As IWshRuntimeLibrary.WshExec
    Dim objStream As New ADODB.Stream
    Set objWshExec = objWshShell.Exec("ipconfig /all")
    With objStream
        .Charset = "Windows-1251"
        .Open
        .WriteText objWshExec.StdOut.ReadAll
        .Position = 0
        .Charset = "cp866"
        Debug.Print .ReadText
    End With
End Sub

Vova_2581
Постоялец
Постоялец
 
Сообщения: 362
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Проблема с кодировкой в перенаправлении вывода

Сообщение Vova_2581 » 08.09.2019 (Вс) 22:13

ALX_2002
У меня компилятор пишет: не определены типы...
Укажите References на Dim objWshShell As New IWshRuntimeLibrary.WshShell --> Windows Script Host Object Model
а дальше...???... Dim objStream As New ADODB.Stream -????
И можно ли обойтись без всяких ссылок на OCX и прочее??? Может что-то нужно просто подправить в самой системе или в VB с кодировкой???
Я делал правку реестра...
Код: Выделить всё
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
"1250"="c_1251.nls"
"1251"="c_1251.nls"
"1252"="c_1251.nls"


НЕ помогло! :cry:

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Проблема с кодировкой в перенаправлении вывода

Сообщение ALX_2002 » 09.09.2019 (Пн) 11:23

Владимир, не советую использовать раннее связывание. Но если очень хочется, то...
Код: Выделить всё
Option Explicit
Sub Main()
    Dim objWshExec
    Set objWshExec = CreateObject("WScript.Shell").Exec("ipconfig /all")
    With CreateObject("ADODB.Stream")
        .Charset = "Windows-1251"
        .Open
        .WriteText objWshExec.StdOut.ReadAll
        .Position = 0
        .Charset = "cp866"
        Debug.Print .ReadText
    End With
End Sub


Скажите, пожалуйста, а какова окончательная цель ? Получать IP адаптеров или "ipconfig /all" у вас просто для теста сделан ?

P.S И трогать настройки кодировки в реестре, без особой надобности, крайне не рекомендую.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 362
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Проблема с кодировкой в перенаправлении вывода

Сообщение Vova_2581 » 09.09.2019 (Пн) 11:53

ALX_2002
Ваш код теперь работает и отображает кириллицу, проблем нет. Спасибо! Но это только полбеды...
ALX_2002 писал(а):..."ipconfig /all" у вас просто для теста сделан ?

Именно так. Просто заметил, что с переходом на 7-ку появилась вот такая проблема с кодировкой и она касается не только конкретно данного кода, но и всех других... чуть позже я вам предоставлю еще один код с той же фигней и сделать .Charset = "Windows-1251"... .Charset = "cp866" в нем уже не получится. По крайней мере я не увидел, где это можно сделать. Чуть позже выложу, а пока скажите еще такую вещь: видимо, как я понимаю, проблема с кодировкой глобальна относительно VB, может все-таки где-то правится в реестре?
ALX_2002 писал(а):...не советую использовать раннее связывание.

Поясните, пожалуйста, почему??? :scratch:

Vova_2581
Постоялец
Постоялец
 
Сообщения: 362
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Проблема с кодировкой в перенаправлении вывода

Сообщение Vova_2581 » 09.09.2019 (Пн) 12:14

Вот... пожалуйста... берем другой пример. Перенаправляем вывод через дочерний процесс создаваемый API - CreateProcess... и снова кракозябры такие...
Screen3.jpg
Screen3.jpg (30.86 Кб) Просмотров: 3898

Где в STARTUPINFO изменить кодировку??? Обратите внимание - и здесь также, перед окончательным выводом, символы конвертируется в Unicode --> txtOutput.Text = txtOutput.Text & StrConv(b, vbUnicode)
Очевидно, что проблема глобальная. Как с этим справится? Может кто-нибудь знает???
Последний раз редактировалось Vova_2581 10.09.2019 (Вт) 11:13, всего редактировалось 2 раз(а).

Vova_2581
Постоялец
Постоялец
 
Сообщения: 362
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Проблема с кодировкой в перенаправлении вывода

Сообщение Vova_2581 » 09.09.2019 (Пн) 12:54

Кстати, если в cmd выполнить перенаправление в файл - ipconfig /all >> c:\ss.txt
Получается та же фигня...
Screen4.jpg
Screen4.jpg (40.99 Кб) Просмотров: 3894

Vova_2581
Постоялец
Постоялец
 
Сообщения: 362
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Проблема с кодировкой в перенаправлении вывода

Сообщение Vova_2581 » 09.09.2019 (Пн) 13:23

Тфу, блин... исправил... :)
Screen5.jpg
Screen5.jpg (30.21 Кб) Просмотров: 3891

Screen6.jpg
Screen6.jpg (31.79 Кб) Просмотров: 3891

Сейчас не могу, занят... позже напишу как это сделал.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Проблема с кодировкой в перенаправлении вывода

Сообщение alibek » 09.09.2019 (Пн) 13:46

В консоли по умолчанию кодовая страница 866.
Нужно либо ее конвертировать, либо выставлять кодовую страницу 65001.
Lasciate ogni speranza, voi ch'entrate.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 362
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Проблема с кодировкой в перенаправлении вывода

Сообщение Vova_2581 » 10.09.2019 (Вт) 22:54

alibek писал(а):Нужно либо ее конвертировать, либо выставлять кодовую страницу 65001

Вы имеете ввиду UTF-8, к сожалению, эта unicode кодировка, в данном случае, не подходит, пробовал... не получилось. К тому же каждый раз перед выполнением командного файла запускать chcp 866 – это неудобно. Реализовывать всякие bat-ники... тоже, к чему они нам??? Один гемор да и только. :( Поэтому извините, но за Сусаниным я не пойду. Мне нужен Александр Македонский и его знаменитый меч, которым мы и разрубим наш гордиев узел.

В общем, если я правильно понимаю, проблема возникла из-за того, что командный процессор использует кодировку cp866 и система поддерживает ее, как DOS наследие, сама же использует кодировку cp1251 - это касательно кириллицы. Одним словом – cmd, ipconfig и прочие... записывают свои отчеты в кодировке 866, а читается потом все это дело, в VB в частности, с кодировкой 1251 вот и выходят кракозыбры...

Значит, что нужно сделать...
Берем топор, ставим перед собой системник и со всего размаху... ... ... а... стоп, стоп... это из другой оперы, я перепутал, извиняюсь... Здесь нужно по-другому... да, извините...
Короче говоря, нужна небольшая правка реестра, вот по этому адресу:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
в параметре: OEMCP исправляем значение 866 на 1251. И перезагружаем компьютер! Это обязательно! Но!.. Как только мы это сделаем, у нас захнычет cmd и покажет нам нечто вроде комбинации из трех пальцев, примерно, такую...
Screen7.jpg
Screen7.jpg (22.9 Кб) Просмотров: 3858

Поэтому, чтобы исправить бяку... нам понадобится еще одна правка реестра, но уже по адресу: HKEY_CURRENT_USER\Console
Здесь мы добавим двоичный параметр: CodePage и укажем 0x00000362, то есть все ту же 866.
Перезагружаться, в данном случае, не обязательно.
Вот теперь полный порядок! Все символы на своих местах... :D
Screen8.jpg
Screen8.jpg (24.36 Кб) Просмотров: 3858

Специально для тех, кому лень вставать с дивана, написал патчи в приложении... Можно запустить reg-файл, но все же рекомендую использовать командные пакетники - .cmd

На этом все. Жмите лайк все, кому хоть как-то помог мой пост в решении подобной проблемы. :)
Вложения
Reg correction.rar
Патчи исправления неправильной кодировки...
(864 байт) Скачиваний: 162

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Проблема с кодировкой в перенаправлении вывода

Сообщение ALX_2002 » 11.09.2019 (Ср) 14:55

Vova_2581, если Вы собираетесь использовать своё приложение только на своём личном ПК, то от части соглашусь, что такое решение приемлемо, но если Вы собираетесь распространять свой код / скрипт / программу, то ПМСМ не стоит делать таких изменений в реестре. Ведь другой софт на том же ПК не рассчитывает на подобные изменения и это может выйти боком. Мне кажется всё-таки стоит подстроить свой код под "стандартное состояние Windows", нежели менять среду вокруг себя. :|

Например, можно анализировать через API информацию о кодовой странице и на основании этого делать перекодировку вывода.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 362
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Проблема с кодировкой в перенаправлении вывода

Сообщение Vova_2581 » 11.09.2019 (Ср) 22:17

Ну, конечно, если писать код для клиента и затем что-либо менять у него в реестре без разрешения - это неприемлемо. Да к тому же, если клиент окажется не из робкого десятка и администрирует свой комп от подобных фокусов, то и не получится что либо изменить без прав администратора. Мне кажется, что мне просто попалась английская версия Win7 с плохой русификацией. Вот и пришлось доработать самому... А у многих русская Win7 настроенная как надо с самого начала. Поэтому словосочетание "стандартное состояние Windows", в данному случае, носит весьма и весьма относительный характер. Но за советы спасибо! Любопытно было почитать... :)

Vova_2581
Постоялец
Постоялец
 
Сообщения: 362
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Проблема с кодировкой в перенаправлении вывода

Сообщение Vova_2581 » 19.11.2019 (Вт) 15:00

P.S.
Почитал дальше... и, думаю, еще раз с Вами согласится...
ALX_2002 писал(а):...подстроить свой код под Windows, нежели менять среду вокруг себя...

Это правильно! Вот только по Вашей ссылке автор того кода Dragokas пошел каким-то сложным путем, используя две API – MultiByteToWideChar и WideCharToMultiByte и еще много ненужных действий, но я нашел более простой путь, в котором перекодировка из DOS (866) в Windows ANSI (1251) выполняется всего одной и очень простой API – OemToChar. Если кому надо, то вот пример кода... Там видео с экранной камеры – как это работает у меня.
Так что дерзайте... :wink:
Вложения
Recoding.rar
DOS to Windows recoding text
(848.5 Кб) Скачиваний: 178

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Проблема с кодировкой в перенаправлении вывода

Сообщение Хакер » 19.11.2019 (Вт) 23:45

Vova_2581 писал(а):используя две API – MultiByteToWideChar и WideCharToMultiByte

Вообще-то для желаемых целей достаточно только первой.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

    TopList  
cron