Кодировка Process.StartInfo.Arguments - PullRequest
1 голос
/ 22 октября 2010

У меня есть приложение .Net, которое запускает процесс, передавая длинный список аргументов через Process.StartInfo.Arguments. Новый процесс может обрабатывать только 8-битные символы в аргументах, передаваемых его функции main (). Поэтому я закодировал строку в Process.StartInfo.Arguments, чтобы каждый символ представлял собой 8-битное значение.

Проблема в том, что новый процесс не видит те же 8-битные значения, которые я использовал. Для значений менее 128 значение проходит через unmoled. Другие значения как-то меняются, и фактически, список аргументов, видимый новым процессом, часто длиннее, чем то, что я передал.

Какая кодировка используется для перевода аргументов при их передаче в новый процесс? Могу ли я изменить эту кодировку?

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

1 Ответ

1 голос
/ 22 октября 2010

Это не то, что вы можете исправить в коде .NET.Класс .NET Process, как и Windows, использует Unicode.Преобразование из Unicode в 8-битную строку символов происходит в библиотеке времени выполнения C, встроенной в программу, которую вы запустили.Это преобразование основано на текущей системной кодовой странице и использует API-функцию WideCharToMultiByte () с CodePage = CP_ACP.Невозможно изменить это преобразование, если не считать изменения системной кодовой страницы.Это оказывает сильное влияние на всю операционную систему.

Конечно, это преобразование с потерями, оно может обрабатывать только те символы, которые определены в кодовой странице.Если вы передадите ему аргумент, содержащий символ Unicode, который не может быть представлен на кодовой странице, программа увидит знак вопроса в этой строке.Никакое количество манипуляций со строками, которые вы могли бы выполнить в своем .NET-коде, не может предотвратить это, если не считать пропуска или замены этого символа.Но тогда вы больше не пропускаете одну и ту же строку.

...