2010-10-22 2 views
1

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

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

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

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

ответ

1

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

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