powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Кодовая страница выходного потока
8 сообщений из 8, страница 1 из 1
Кодовая страница выходного потока
    #38191532
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.

Программно читаю содержимое выходного потока, от созданного мною процесса. Получаю кракозяблы вместо кирилицы. Нужно как-то автоматом определять нужную кодировку. Операционная система и приложение, создавшее выше указанный процесс, могут иметь различную локализацию (т.е. Windows Enu\Rus и AutoCAD Enu\Rus).

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
App.Document doc = cad.DocumentManager.MdiActiveDocument;
if (doc != null)
    doc.Editor.WriteMessage("\nПроцесс запущен. Пожалуйста подождите...\n");

String exeName = Path.Combine(curDir, "recovery");

Process proc = new Process();
ProcessStartInfo info = new ProcessStartInfo();
info.CreateNoWindow = true;
info.RedirectStandardOutput = true;
info.UseShellExecute = false;

// info.StandardOutputEncoding = Encoding.GetEncoding(1251);
info.StandardOutputEncoding = Console.OutputEncoding;

info.FileName = exeName;
info.Arguments = String.Format("{0} -clear", @"%zipDir%\acad_R17.2.zip");
proc.StartInfo = info;

proc.Start();

String outputText = proc.StandardOutput.ReadToEnd();
proc.WaitForExit();

if (doc != null) {
    doc.Editor.WriteMessage(outputText);
    doc.Editor.WriteMessage(Environment.NewLine);
}


На выходе получаю такой текст:

outputTextrecovery; (c) Andrey Bushman, 2013

ЋЎа Ў®вЄ  Є в «®Ј  "%acad_R17.2%".
ќ«Ґ¬Ґ­в: AutoCAD 2009/; –Ґ«Ґў®© Є в «®Ј: C:\Program Files\Autodesk; ЋиЁЎЄ : ЋвЄ § ­® ў ¤®бвгЇҐ Ї® ЇгвЁ "acad.CUI".
ЋЎа Ў®вЄ  Є в «®Ј  "%rmb_acad_R17.2%".
ЋЎа Ў®вЄ  Є в «®Ј  "%local_acad_R17.2%".
ЋЎа Ў®вЄ  Є в «®Ј  "%allUsers_acad_R17.2%".
ЋЎа Ў®вЄ  Є в «®Ј  "%shared_acad_R17.2%".
ќ«Ґ¬Ґ­в: Autodesk Shared/; –Ґ«Ґў®© Є в «®Ј: C:\Program Files\Common Files; ЋиЁЎЄ : ЋвЄ § ­® ў ¤®бвгЇҐ Ї® ЇгвЁ "C:\Program Files\Common Files\Autodesk Shared\".
ЋЎа Ў®вЄ  Є в «®Ј  "%ext_acad_R17.2%".

Если перенаправление не выполнять, то в самой консоли Windows текст отображается корректно.

С уважением, Андрей
____________
Британские "учёные" - фундаментальный подход к разной фигне...
...
Рейтинг: 0 / 0
Кодовая страница выходного потока
    #38191732
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, методом перебора всех имеющихся кодировок определил нужную: cp866. Читал из потока вместо текста байты и преобразовывал их в текст кодировок, проверяя в отладчике содержимое. Тестовый код был таким:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
App.Document doc = cad.DocumentManager.MdiActiveDocument;
if (doc != null)
    doc.Editor.WriteMessage("\nПроцесс запущен. Пожалуйста подождите...\n");
String exeName = Path.Combine(curDir, "recovery");
Process proc = new Process();
ProcessStartInfo info = new ProcessStartInfo();
info.CreateNoWindow = true;
info.RedirectStandardOutput = true;
info.UseShellExecute = false;
// info.StandardOutputEncoding = Encoding.GetEncoding(1251);
// info.StandardOutputEncoding = Console.OutputEncoding;
info.StandardOutputEncoding = Encoding.UTF8;
info.FileName = exeName;
info.Arguments = String.Format("{0} -clear", @"%zipDir%\acad_R17.2.zip");
proc.StartInfo = info;
proc.Start();

String outputText = String.Empty;

// Вариант: читаю непосредственно строку.
// outputText = proc.StandardOutput.ReadToEnd();

// Вариант 2: читаю байты и затем преобразую их в кодировку.
List<Byte> bytes = new List<byte>();
Int32 x;
while ((x = proc.StandardOutput.BaseStream.ReadByte()) != -1) {
    bytes.Add((Byte) x);
}
proc.WaitForExit();

// Этот блок кода относится ко 2-му варианту. Его нужно закомментировать для первого.
foreach (EncodingInfo ei in Encoding.GetEncodings()) {
    Encoding enc = ei.GetEncoding(); // Нужной кодировкой оказалась cp866.
    outputText = enc.GetString(bytes.ToArray());
}

if (doc != null) {
    doc.Editor.WriteMessage(outputText);
    doc.Editor.WriteMessage(Environment.NewLine);
    doc.Editor.WriteMessage("Операция завершена.");
    doc.Editor.WriteMessage(Environment.NewLine);
}


Пока что в коде жёстко пропишу кодировку cp866, но если кто подскажет вариант автоматического определения нужной - буду признателен.

С уважением, Андрей.
...
Рейтинг: 0 / 0
Кодовая страница выходного потока
    #38191798
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашёл два варианта решения, оба работают:

1. GetOEMCP
2. CultureInfo.CurrentCulture.TextInfo.OEMCodePage

Мало ли, может ещё кому пригодится.
...
Рейтинг: 0 / 0
Кодовая страница выходного потока
    #38192105
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Compositumно если кто подскажет вариант автоматического определения нужной

Автоматическое определение, что надо перекодировать из 866


Код: c#
1.
2.
3.
Regex r = new Regex(@"[ЋЎќҐЄ]");

bool cp866 = r.IsMatch(text);
...
Рейтинг: 0 / 0
Кодовая страница выходного потока
    #38192121
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
@ Cat2
И что это даст? Кроме того, я ведь выше уже показал два "родных" способа решения.
...
Рейтинг: 0 / 0
Кодовая страница выходного потока
    #38192198
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
CompositumИ что это даст?
Быстрее. Оба описанных выше способа лезут в реестр
...
Рейтинг: 0 / 0
Кодовая страница выходного потока
    #38192209
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Быстрее.
Честно говоря, я не понял этого кода.... Что именно будет быстрее? Вы сравнили текст с указанным некоторым паттерном, а как это поможет кодировку узнать? Предположим, что IsMatch возвратит false, что тогда?
...
Рейтинг: 0 / 0
Кодовая страница выходного потока
    #38192463
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumНашёл два варианта решения, оба работают:

1. GetOEMCP
2. CultureInfo.CurrentCulture.TextInfo.OEMCodePage

Мало ли, может ещё кому пригодится.
А я не понял, в чем суть проблемы, и в чем смысл предложенного решения. Не знали, какая кодировка используется в консоли на windows с локалью 1049? Просто запомните - это cp866. А предложенные решения просто вернут OEM-кодировку в текущем окружении, не более. И в определении кодировки содержимого любого другого потока, отличного от консольного, они не помогут.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Кодовая страница выходного потока
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]