Кодировка при чтении из stdin
От: Somescout  
Дата: 11.09.19 18:06
Оценка:
Здравствуйте.

Пытаюсь передать данные из одной программы в другую через перенаправление ввода, примерно так:
  Запускающая программа
            var serializer = new XmlSerializer(typeof(PowershellCommand));

            // Говнокод, в процессе переделки
            var pwd = new NetworkCredential("", command.Password).SecurePassword;

            var psi = new ProcessStartInfo
            {
                Domain = command.Domain,
                UserName = command.UserName,
                Password = pwd,
                FileName = powershellHostPath,

                CreateNoWindow = true,

                RedirectStandardInput = true,
            };

            try
            {
                var process = Process.Start(psi);

                serializer.Serialize(process.StandardInput, command.Command);
                process.StandardInput.Close();

                return process;
            }
            catch (Win32Exception ex) when (ex.HResult == -2147467259 && ex.NativeErrorCode == 1326) // 0x80004005
  Вызываемая программа

        private PowershellCommand GetCommand()
        {
            if (Console.IsInputRedirected)
            {
                return ReadCommand(Console.In);
            } else {...}
    }

        private PowershellCommand ReadCommand(System.IO.TextReader textReader)
        {
            var serializer = new XmlSerializer(typeof(PowershellCommand));

            return (PowershellCommand)serializer.Deserialize(textReader);
        }

Всё работает отлично, пока не встречается текст на русском — он превращается в кашу. Есть какой-нибудь способ корректно передавать кодировку (я пока обошёл это Base64)?

ЗЫ. Побочный вопрос: насколько я понимаю, если stdout родительского процесса перенаправлен, у дочернего он тоже будет перенаправлен — можно ли как-то заставить его игнорировать перенаправление и выводить в консоль?
ARI ARI ARI... Arrivederci!
Re: Кодировка при чтении из stdin
От: Слава  
Дата: 11.09.19 18:32
Оценка:
Здравствуйте, Somescout, Вы писали:

S>Здравствуйте.


S>Пытаюсь передать данные из одной программы в другую через перенаправление ввода, примерно так:


Он же бинарный, вроде. Зачем там base64?
Re: Кодировка при чтении из stdin
От: kov_serg Россия  
Дата: 11.09.19 20:03
Оценка:
Здравствуйте, Somescout, Вы писали:


S>Всё работает отлично, пока не встречается текст на русском — он превращается в кашу. Есть какой-нибудь способ корректно передавать кодировку (я пока обошёл это Base64)?

https://stackoverflow.com/questions/4928323/xml-serialization-encoding
Re: Кодировка при чтении из stdin
От: Mr.Delphist  
Дата: 13.09.19 10:38
Оценка:
Здравствуйте, Somescout, Вы писали:

S>Всё работает отлично, пока не встречается текст на русском — он превращается в кашу. Есть какой-нибудь способ корректно передавать кодировку (я пока обошёл это Base64)?


А с какой кодировкой сериализует сейчас XmlSerializer? По дефолту там вроде UTF-16 должно быть, странно что получается каша. Возможно, у этих софтин окна не юникодные?
Re[2]: Кодировка при чтении из stdin
От: Somescout  
Дата: 13.09.19 11:54
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

S>>Всё работает отлично, пока не встречается текст на русском — он превращается в кашу. Есть какой-нибудь способ корректно передавать кодировку (я пока обошёл это Base64)?


MD>А с какой кодировкой сериализует сейчас XmlSerializer? По дефолту там вроде UTF-16 должно быть, странно что получается каша. Возможно, у этих софтин окна не юникодные?


У меня есть предположение, что родительская софтина (1С, которая запускает "запускатель") для себя выставляет другую кодировку, т.к. при запуске из обычного cmd ошибка не проявляется (если оставить кодировку по умолчанию).
ARI ARI ARI... Arrivederci!
Re[2]: Кодировка при чтении из stdin
От: Ночной Смотрящий Россия  
Дата: 13.09.19 12:29
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>А с какой кодировкой сериализует сейчас XmlSerializer? По дефолту там вроде UTF-16 должно быть


UTF-8
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[3]: Кодировка при чтении из stdin
От: Mr.Delphist  
Дата: 13.09.19 12:57
Оценка:
Здравствуйте, Somescout, Вы писали:

S>У меня есть предположение, что родительская софтина (1С, которая запускает "запускатель") для себя выставляет другую кодировку, т.к. при запуске из обычного cmd ошибка не проявляется (если оставить кодировку по умолчанию).


Тогда надо исследовать с какими параметрами оно порождает консоль, да. Вдруг там KOI-8R
Re[3]: Кодировка при чтении из stdin
От: Mr.Delphist  
Дата: 13.09.19 13:00
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, Mr.Delphist, Вы писали:


MD>>А с какой кодировкой сериализует сейчас XmlSerializer? По дефолту там вроде UTF-16 должно быть


НС>UTF-8


Почему? Вроде стандартная кодировка в .NET именно двухбайтовая, чтобы не порождать лишних перекодировок при работе со стрингами.
Re[4]: Кодировка при чтении из stdin
От: Ночной Смотрящий Россия  
Дата: 13.09.19 14:43
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

НС>>UTF-8

MD>Почему? Вроде стандартная кодировка в .NET именно двухбайтовая

Стандартная для ввода/вывода — UTF8.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[4]: Кодировка при чтении из stdin
От: Ночной Смотрящий Россия  
Дата: 13.09.19 14:43
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>Тогда надо исследовать с какими параметрами оно порождает консоль, да. Вдруг там KOI-8R


Скорее СР-866
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[5]: Кодировка при чтении из stdin
От: Mr.Delphist  
Дата: 13.09.19 15:05
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, Mr.Delphist, Вы писали:


НС>>>UTF-8

MD>>Почему? Вроде стандартная кодировка в .NET именно двухбайтовая

НС>Стандартная для ввода/вывода — UTF8.


Ага, так и есть — UTF8:
https://docs.microsoft.com/en-us/dotnet/api/system.xml.xmlwritersettings.encoding?view=netframework-4.8

Property Value

Encoding
The text encoding to use. The default is Encoding.UTF8.


Возможно, в первую очередь для компактного размера результатирующего буфера — вроде однобайтовый, но для нестандартных символов тоже работает (за счёт переключающих префиксов).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.