Проблема с кодировкой.

regist

гоняюсь за туманом
Ассоциация VN/VIP
VIP
Разработчик
Сообщения
14,886
Реакции
6,796
Вот тема с вопросом про батник, который я упоминал раньше в соседнем разделе.
Вопросов собственно говоря два.
1) Основной вопрос
Есть скрипт AVZ (автор скрипта Vadim Vygovsky ака Vvvyg).
Код:
var
STR : TStringList;
CMDFile: string;
begin
ExecuteFile('ipconfig.exe', '/flushdns', 0, 15000, true);
STR := TStringList.Create;
STR.Add('ipconfig /all > diag.log');
STR.Add('ping www.yandex.ru >> diag.log');
STR.Add('tracert www.yandex.ru >> diag.log');
STR.SaveToFile(GetAVZDirectory + 'diag.cmd');
CMDFile:= GetAVZDirectory + 'diag.cmd';
ExecuteFile(CMDFile, '', 0, 200000, true);
end.

Скрипт очень удобный и можно править под свои нужны, но есть минус кодировка отчёта на выходе. Решил это исправить добавив строчку STR.Add('chcp 1251 > diag.log');
То есть получаем вот такой скрипт
Код:
var
STR : TStringList;
CMDFile: string;
begin
ExecuteFile('ipconfig.exe', '/flushdns', 0, 15000, true);
STR := TStringList.Create;
STR.Add('chcp 1251 > diag.log');
STR.Add('ipconfig /all > diag.log');
STR.Add('ping www.yandex.ru >> diag.log');
STR.Add('tracert www.yandex.ru >> diag.log');
STR.SaveToFile(GetAVZDirectory + 'diag.cmd');
CMDFile:= GetAVZDirectory + 'diag.cmd';
ExecuteFile(CMDFile, '', 0, 200000, true);
end.
В cmd это будет
CMD/BATCH:
chcp 1251
ipconfig /all > diag.log
ping www.yandex.ru >> diag.log
tracert www.yandex.ru >> diag.log
Но отчёт на выходе всё равно получаем в OEM 866 :(. Как это исправить ?

2) Второй вопрос появился уже в ходе попытки разобраться почему это происходит.
Запускаем этот батник и видим, что там дописалась ещё единичка. Откуда она взялась?
Link Removed
 
Последнее редактирование:
regist, пришли файл diag.log
Я непроверенные ответы не хочу давать.
У меня здесь сеть особенная. ping и tracert не отрабатывают.
И картинки твоей мне не видно. Прикрепи архивом, или обычным вложением, пожалуйста.Через chcp вот так напрямую не получится.
Это обман зрения. Вы на экране видите, что текст изменил кодировку, а на самом деле это не так.
Если будет интересно, напишу почему.

Чтобы не писать гору кода, проще воспользоваться функцией самой CMD.
Единственный минус: текст на выходе будет в кодировке Unicode UTF-16 LE (а не WIN-1251).
Код:
ExecuteFile('cmd.exe', '/u /c type diag.log > diag2.log', 0, 10000, true);
Ох. Да этот AVZ блокирует доступ запускаемым процессам к переменным окружения. О_о.Такс. Из того же батника тоже работает. Видимо не нажал F5.
Код:
STR.Add('cmd /u /c type diag.log > diag2.log');
 
Единственный минус: текст на выходе будет в кодировке Unicode UTF-16 LE (а не WIN-1251).
имхо, это не проблема (по крайней мере для меня так как текстовые файлы смотрю через Notepad++ а у него с юникодом проблем нет).
У меня здесь сеть особенная. ping и tracert не отрабатывают.
это не к спеху, подожду. Эти эксперименты я вообще ещё в августе делал ))).
Через chcp вот так напрямую не получится.
Это обман зрения. Вы на экране видите, что текст изменил кодировку, а на самом деле это не так.
Если будет интересно, напишу почему.
да интересно :).
И картинки твоей мне не видно.
D:\Antivir utiliti\avz4>chcp 866
Текущая кодовая страница: 866

D:\Antivir utiliti\avz4>ipconfig /all 1>diag.log

D:\Antivir utiliti\avz4>ping www.yandex.ru 1>>diag.log

D:\Antivir utiliti\avz4>tracert www.yandex.ru 1>>diag.log
STR.Add('cmd /u /c type diag.log > diag2.log');
Проблема похоже решена (y)

Правда ещё интересно откуда эта единичка берётся.
 
Правда ещё интересно откуда эта единичка берётся.
Видимо CMD включает свой интеллект и показывает номер потока, а точнее полный синтаксис команды.

Потоки, те которые stream, а не thread, делятся на 3 основных вида и имеют соответственные номера:
№ 0 - входящий поток (зачастую это данные, которые вводятся с клавиатуры).
№ 1 - стандартный поток вывода.
№ 2 - поток вывода ошибок.
№ 3-9 - пользовательские потоки вывода.

Консольные команды/утилиты умеют передавать вывод в любой из потоков 1-9.
Зачастую обычная текстовая информация попадает в поток №1, сообщения об ошибках - в поток № 2.

Команда > Файл
в CMD означает перенаправление потока вывода от команды во внешний файл (если он уже существует, то будет перезаписан).
>> - тоже самое, но информация будет дописана в конец файла.
По умолчанию, берется поток № 1, что соответствует:
Команда 1> Файл

Кроме того, можно вывести в файл отдельно поток ошибок:
Команда 2> Файл

При диагностике возможных ошибок наиболее полезно будет консолидировать оба потока при выводе в файл:
Команда > Файл 2>&1

Замечание:
Консоль CMD выводит на экран оба потока. Так, определить сразу нельзя какой это 1-й или 2-й.
Чтобы узнать попала ли часть информации в поток ошибок,
нужно выполнить команду:
Команда >NUL
или
Команда 1>NUL
Dragokas написал(а):
Через chcp вот так напрямую не получится.
Это обман зрения. Вы на экране видите, что текст изменил кодировку, а на самом деле это не так.
Если будет интересно, напишу почему.
regist написал(а):
Когда ты ложишь кетчуп на колбасу - это выглядит весьма вкусно.
Когда ты ложишь его на апельсин - получается непонятно что.

Представь, что команда CHCP изменяет основание консоли с апельсина на колбасу.
Кетчуп получается весьма аппетитным, но это все тот же кетчуп, его кодировка не поменялась.

Теперь ты пытаешься отправить кетчуп с консоли в файл. А файл основан все на том же апельсине.

Иными словами chcp изменяет только окружение консоли. С текстом в бинарном смысле ничего не происходит.
Изменяется только его визуальное представление в конкретной сессии консоли.
 
Последнее редактирование:
Кстати npp определяет, как Unix UCS-2 LE
Правильно. Там только текст в юникоде (без BOM).
Для полноценного нужно добавить хидер 0xFF 0xFE.

Код:
ipconfig /all > ip.log
chcp 1251 >nul
set /p=яю<NUL > ip2.log
chcp 866 >nul
cmd /u /c type ip.log >> ip2.log

При этом сам батник должен быть в кодировке WIN-1251 (по-умолчанию, AVZ так и создает).

В отличие от моих пояснений выше, здесь CHCP будет влиять на вывод.
set /p=Текст<NUL по сути является аналогом echo Текст (вывод на экран консоли слова Текст),
только без переноса каретки. Сам синтаксис set /p использован недокументированный (дважды), но об этом не буду.

Главное это, что текст сначала "распечатывается на экране", а уж затем в таком же виде попадает во внешний файл.
Можно убедится на небольшом тесте с переменными:
CMD/BATCH:
:: устанавливаем кодировку 866
chcp 866
:: Записываем в переменную x слово "Текст" в кодировке 866 (среда также влияет)
set x=Текст
:: раскрываем переменную, текст попадает на экран в представлении кодировки 866, и затем в этом же виде перенаправляется в файл
echo %x%>1.log
:: меняем кодировку на 1251
chcp 1251
:: раскрываем в представлении 1251, дописывая в конец файла
echo %x%>>1.log
pause

На счет команды TYPE я провел пару экпериментов, но однозначного ответа, почему так происходит, у меня нет.
Под ключем CMD /U на нее влияет кодировка среды, а при других ключах, нет.
 
CMD/BATCH:
::set /p=яю<NUL > %userprofile%\Desktop\ip2a.log
А что делает эта сэт ?? По моему ничего :unsure:
Я так проверял -
CMD/BATCH:
chcp 866
ipconfig /all >%userprofile%\Desktop\ipconfig0.log
cmd /a /c type %userprofile%\Desktop\ipconfig0.log > %userprofile%\Desktop\ipconfig-a.log
cmd /u /c type %userprofile%\Desktop\ipconfig0.log > %userprofile%\Desktop\ipconfig-u.log

chcp 1251
ipconfig /all >%userprofile%\Desktop\ipconfig1.log
cmd /a /c type %userprofile%\Desktop\ipconfig1.log > %userprofile%\Desktop\ipconfig-a1.log
cmd /u /c type %userprofile%\Desktop\ipconfig1.log > %userprofile%\Desktop\ipconfig-u1.log
 
Phoenix, я писал - добавляет хидер. Посмотри через HEX-редактор.
"яю" без переноса каретки (т.е. без 0x0D, 0x0A).

Если интересует разобрать конструкцию, то:
set /p x=
- предназначена для ввода с клавиатуры данных (признак завершения - кнопка { ENTER } ) и присвоения переменной x.
При этом, она может предусматривать строку приглашения, которая не влияет на команду,
но является подсказкой для пользователя и выводится на экран:
set /p x=Введите число
Ввод с клавиатуры происходит на той же строке (без переноса каретки).
Set_P.png
set /p x=Введите число<NUL > file
<NUL - имитирует ввод за пользователя { ENTER }
> file - перенаправляет строку приглашения во внешний файл (без перевода каретки).
 
Проблема похоже решена
увы не до конца. На русской XP крякозябры, как понимаю это баг майкрософт, до этого столкнулся с ним тут.

В общем лог на русской XP
═рёЄЁющър яЁюЄюъюыр IP фы Windows



╚ь ъюья№■ЄхЁр . . . . . . . . . : 6e274888d763498

╬ёэютэющ DNS-ёєЇЇшъё . . . . . . :

╥шя єчыр. . . . . . . . . . . . . : ёьх°рээ√щ

IP-ьрЁ°ЁєЄшчрЎш тъы■ўхэр . . . . : эхЄ

WINS-яЁюъёш тъы■ўхэ . . . . . . . : эхЄ

╧юЁ фюъ яЁюёьюЄЁр ёєЇЇшъёют DNS . : mshome.net



╧юфъы■ўхэшх яю ыюъры№эющ ёхЄш - Ethernet рфряЄхЁ:



DNS-ёєЇЇшъё ¤Єюую яюфъы■ўхэш . . : mshome.net

╬яшёрэшх . . . . . . . . . . . . : Atheros AR8152 PCI-E Fast Ethernet Controller

╘шчшўхёъшщ рфЁхё. . . . . . . . . : 00-26-6C-81-80-14

Dhcp тъы■ўхэ. . . . . . . . . . . : фр

└тЄюэрёЄЁющър тъы■ўхэр . . . . . : фр

IP-рфЁхё . . . . . . . . . . . . : 192.168.0.224

╠рёър яюфёхЄш . . . . . . . . . . : 255.255.255.0

╬ёэютэющ °ы■ч . . . . . . . . . . : 192.168.0.1

DHCP-ёхЁтхЁ . . . . . . . . . . . : 192.168.0.1

DNS-ёхЁтхЁ√ . . . . . . . . . . . : 192.168.0.1

└Ёхэфр яюыєўхэр . . . . . . . . . : 9 этрЁ 2014 у. 15:04:14

└Ёхэфр шёЄхърхЄ . . . . . . . . . : 16 этрЁ 2014 у. 15:04:14



MTC - PPP рфряЄхЁ:



DNS-ёєЇЇшъё ¤Єюую яюфъы■ўхэш . . :

╬яшёрэшх . . . . . . . . . . . . : WAN (PPP/SLIP) Interface

╘шчшўхёъшщ рфЁхё. . . . . . . . . : 00-53-45-00-00-00

Dhcp тъы■ўхэ. . . . . . . . . . . : эхЄ

IP-рфЁхё . . . . . . . . . . . . : 78.***.**.230

╠рёър яюфёхЄш . . . . . . . . . . : 255.255.255.255

╬ёэютэющ °ы■ч . . . . . . . . . . : 78.***.**.230

DNS-ёхЁтхЁ√ . . . . . . . . . . . : 78.***.**.12

78.109.33.11

NetBIOS ўхЁхч TCP/IP. . . . . . . : юЄъы■ўхэ



Обмен пакетами с vk.com [31.214.145.172] по 32 байт:



Превышен интервал ожидания для запроса.

Превышен интервал ожидания для запроса.

Превышен интервал ожидания для запроса.

Превышен интервал ожидания для запроса.



Статистика Ping для 31.214.145.172:

Пакетов: отправлено = 4, получено = 0, потеряно = 4 (100% потерь),



Трассировка маршрута к vk.com [31.214.145.172]

с максимальным числом прыжков 30:



1 2 ms 1 ms 1 ms 10.147.175.6

2 * * * Превышен интервал ожидания для запроса.

3 * * * Превышен интервал ожидания для запроса.

4 2 ms 1 ms 2 ms websalon.angara.ru [78.109.32.18]

5 2 ms 5 ms 2 ms akd-cr01-ae2.321.irk.stream-internet.net [212.188.40.153]

6 104 ms 107 ms 104 ms kras-cr01-ae1.38.kia.stream-internet.net [195.34.53.193]

7 104 ms 109 ms 104 ms psvost-cr01-xe-4-0-2.24.nsk.stream-internet.net [212.188.42.177]

8 133 ms 104 ms 104 ms pstav-cr01-ae6.54.omsk.stream-internet.net [212.188.28.157]

9 108 ms 107 ms 107 ms psber-cr01-ae5.55.tum.stream-internet.net [212.188.28.161]

10 107 ms 107 ms 107 ms psshag-cr01-ae4.72.chel.stream-internet.net [212.188.29.225]

11 104 ms 104 ms 104 ms psbek-cr01-ae3.174.ufa.stream-internet.net [212.188.42.125]

12 104 ms 104 ms 104 ms pskir-cr01-ae2.2.sam.stream-internet.net [212.188.28.49]

13 110 ms 107 ms 124 ms psulnsk-cr01-ae1.63.uln.stream-internet.net [212.188.28.225]

14 103 ms 113 ms 105 ms pspenz-cr01-ae2.73.pen.stream-internet.net [212.188.28.209]

15 105 ms 104 ms 105 ms pstamb-cr01-ae4.58.tam.stream-internet.net [212.188.29.181]

16 113 ms 104 ms 104 ms psnmich-cr01-ae5.68.rzn.stream-internet.net [212.188.28.201]

17 108 ms 108 ms 108 ms m9-cr05-ae4.162.msk.stream-internet.net [212.188.55.93]

18 110 ms 108 ms 107 ms a197-cr04-BE9-77.msk.stream-internet.net [212.188.2.53]

19 105 ms 104 ms 104 ms oct-cr03-be1-78.spb.stream-internet.net [212.188.2.37]

20 108 ms 107 ms 107 ms bro-cr01-be5.stk.stream-internet.net [212.188.2.93]

21 104 ms 104 ms 104 ms 10gigabitethernet1-2.core1.sto1.he.net [194.68.123.187]

22 112 ms 120 ms 112 ms 10ge3-1.core1.cph1.he.net [184.105.223.206]

23 121 ms 122 ms 122 ms 10ge16-1.core1.fra1.he.net [184.105.223.201]

24 160 ms 121 ms 122 ms os.gigabitethernet2-12.core1.fra1.he.net [216.66.84.222]

25 * * * Превышен интервал ожидания для запроса.

26 * * * Превышен интервал ожидания для запроса.

27 * * * Превышен интервал ожидания для запроса.

28 * * * Превышен интервал ожидания для запроса.

29 * * * Превышен интервал ожидания для запроса.

30 * *
Решение как понимаю надо искать в преобразование лога по частям, но при этом ещё зависимость от того как на какой ОС выполняется.
 
Тоже на ХР каракалица :unsure: В 1251 перекодировалась нормально.
═рёЄЁющър яЁюЄюъюыр IP фы Windows



╚ь ъюья№■ЄхЁр . . . . . . . . . : 456-198d1079c1b

╬ёэютэющ DNS-ёєЇЇшъё . . . . . . :

╥шя єчыр. . . . . . . . . . . . . : эхшчтхёЄэ√щ

IP-ьрЁ°ЁєЄшчрЎш тъы■ўхэр . . . . : эхЄ

WINS-яЁюъёш тъы■ўхэ . . . . . . . : эхЄ



╧юфъы■ўхэшх яю ыюъры№эющ ёхЄш 2 - Ethernet рфряЄхЁ:



DNS-ёєЇЇшъё ¤Єюую яюфъы■ўхэш . . :

╬яшёрэшх . . . . . . . . . . . . : HUAWEI Mobile Connect - Network Card

╘шчшўхёъшщ рфЁхё. . . . . . . . . : 00-1E-10-1F-52-24

Dhcp тъы■ўхэ. . . . . . . . . . . : фр

└тЄюэрёЄЁющър тъы■ўхэр . . . . . : фр

IP-рфЁхё . . . . . . . . . . . . : 172.18.179.9

╠рёър яюфёхЄш . . . . . . . . . . : 255.255.255.252

╬ёэютэющ °ы■ч . . . . . . . . . . : 172.18.179.10

DHCP-ёхЁтхЁ . . . . . . . . . . . : 172.18.179.10

DNS-ёхЁтхЁ√ . . . . . . . . . . . : 10.0.140.86

10.0.140.77

└Ёхэфр яюыєўхэр . . . . . . . . . : 8 этрЁ 2014 у. 16:56:44

└Ёхэфр шёЄхърхЄ . . . . . . . . . : 8 этрЁ 2014 у. 18:56:44
 
Последнее редактирование:
Тоже на ХР каракалица В 1251 перекодировалась нормально.
Phoenix, дело в том, что на этой версии windows эта часть лога выводится в ANSI таким образом, когда мы начинаем менять кодировку чтобы сделать лог читабельным, то наоборот кодируем его в нечитабельный.
 
увы не до конца. На русской XP крякозябры, как понимаю это баг майкрософт, до этого столкнулся с ним тут.
Может, быть разве что баг с твиками для винды.

Phoenix, дело в том, что на этой версии windows эта часть лога выводится в ANSI таким образом, когда мы начинаем менять кодировку чтобы сделать лог читабельным, то наоборот кодируем его в нечитабельный.
Т.е. ты хочешь сказать, твой (Vvvyg-а) исходный скрипт без модификаций выдает сразу читабельный лог на выходе?

Попробуй прибить всю ветку реестра HKCU\Console
Скажешь, как результаты.
Если нет, попробуй применить Codepage Repair.
Причину надо выяснить.
 
Т.е. ты хочешь сказать, твой (Vvvyg-а) исходный скрипт без модификаций выдает сразу читабельный лог на выходе?
да, начальная часть лога на такой системе читабельная. Я вот даже подумал, может тупо дублировать этот кусок лога? Или просто просить оба файла до декодирования и после. Хотя конечно хотелось бы более изящного решения :artist:
Попробуй прибить всю ветку реестра HKCU\Console
Скажешь, как результаты.
1) у меня MUI - так что на своей системе я это проверять не могу (проблема не воспроизводится).
2) Дело не твиках и не в повреждениях реестра и т.д., когда разбился с этим этот вопрос долго изучал. Такое происходит на оригильной (без твиков) системе, а твикать юзеру ради этого скрипта сам понимаешь не вариант.
 
На XP просто не надо декодировать. Замечал, что на некоторых системах ipconfig /all>"%userprofile%\ipc.log" нормально выводит. (скорее всего на ХР) Проверка подтвердила.
да, начальная часть лога на такой системе читабельная.
Под спойлером у вас читабельно в вашем выводе.
Я вот даже подумал, может тупо дублировать этот кусок лога?
Почему бы и нет. Либо два лога лога делать. Один перекодированный, второй как есть. Или делать проверку - если ХР не кодировать системный вывод.
 
Удивительно.
Как это возможно. В XP ru действительно ipconfig через поток присылает данные сразу в WIN-1251, при этом в консоле печатает как DOS-866.
Впервые такое вижу.
Надо у других экспертов спросить. Проведу еще пару экспериментов.
 
Phoenix, это не та ссылка. Для каждого языка отдельно. Пакет MUI для XP платный.
А для Win7 качается через стандартный интерфейс обновлений Windows:

upd4.png


upd_5.png


Затем выбираешь (или установщик у тебя спрашивает) вот в этом меню какому языку ты отдаешь приоритет:

non-Unicode_lang.png


Параметр сохраняется в виде номера кодовой страницы в ветку реестра: HKLM\SYSTEM\CurrentControlSet\Control\Nls\Language -> Default
Изменения вступают в силу после перезагрузки.

Но и тут не все гладко. MUI официально устанавливается только на Enterprise и Ultimate.
К счастью, народные умельцы уже научились это обходить через командную строку.
 
К счастью, народные умельцы уже научились это обходить через командную строку.
Я такое делал от сюда ,про ХР - что отдельная лицензия, что значит платный ? Пройти проверку подлинности надо.

Код:
Требования к системе
Поддерживаемая операционная система
Windows XP Service Pack 2This update applies to Windows XP Professional (32-bit) Service Pack 2 with Microsoft Windows XP Multilingual User Interface Pack (MUI) installed.
В 7 программы tracert, ping, ipconfig на русском,а в winsxs английская...
 
А что значит MUI, она что сразу на несколько языков локализована ?
MUI - практически полная русификация/украинезация и т. д. Cтавится только на английскую версию Windows XP Professional.
LIP - только интерфейс, в нем переведено только около 70% интерфейса и справки.
Удивительно.
Как это возможно. В XP ru действительно ipconfig через поток присылает данные сразу в WIN-1251, при этом в консоле печатает как DOS-866.
Впервые такое вижу.
тут хоть целиком вывод одной команды в другой кодировке, а на сколько помню там в какой-то команде только одно слово "сервер" выводится в другой кодировке. В общем пути майкрософт не постижимы.
 
Назад
Сверху Снизу