2010-04-13 1 views
8

Можете ли вы использовать строку UTF-8 как Аргументы для StartInfo?Поддерживает ли Process.StartInfo.Arguments строку UTF-8?

Я пытаюсь передать UTF-8 (в данном случае японскую строку) в приложение в качестве аргумента консоли.

Нечто подобное (это только пример! (Cmd.exe будет пользовательские приложения))

var process = new System.Diagnostics.Process(); 
process.StartInfo.Arguments = "/K \"echo これはテストです\""; 
process.StartInfo.FileName = "cmd.exe"; 
process.StartInfo.UseShellExecute = true; 

process.Start(); 
process.WaitForExit(); 

Исполнительное это, кажется, теряет строку UTF-8 и все целевое приложение видит " echo ????????? "

При выполнении этой команды непосредственно в командной строке (путем вставки аргументов) целевое приложение правильно принимает строку, даже если сама строка командной строки не отображает ее правильно.

Нужно ли мне что-либо делать, чтобы включить поддержку UTF-8 в аргументах или это просто не поддерживается?

ответ

1

Это полностью зависит от программы, которую вы пытаетесь запустить. Класс Process полностью поддерживает Unicode, также как и операционная система. Но программа может быть старой и использовать 8-битные символы. Он будет использовать GetCommandLineA() для извлечения аргументов командной строки, ANSI-версии собственной функции Unicode GetCommandLineW() API. И это преобразует строку Unicode в 8-разрядные символы, используя кодовую страницу по умолчанию системы, как это было настроено в панели управления + региональные и языковые параметры, язык для программ, отличных от Unicode. WideCharToMultiByte() с использованием CP_ACP.

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

1

Я только что создал приложение Windows Forms, которое отображает Environment.CommandLine в RichTextBox, и строка была отображена правильно, поэтому можно передать строку Unicode таким образом.

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

+0

Вы передали аргументы в свое приложение, запустив приложение с помощью Process и ProcessStartInfo или непосредственно из командной строки? –

+0

Я использовал Process/ProcessStartInfo - я только изменил «cmd.exe» на «test.exe», который был моим приложением WinForms. –

0

Используемые строки [System.String или простые string] основаны на Unicode. Таким образом, да, они могут поддерживать вышеупомянутую кодировку.

Посмотрите here

Вы должны проверить связанные ОС настройки (кодировок, языки и т.д.)

+0

Я знаю, что строки поддерживают unicode - я просто не уверен, правильно ли свойство Arguments в ProcessStartInfo распространяет это на исполняемое приложение. Кажется, это не так. –

4

программы получают свои командные строки в UTF-16, той же кодировке, .NET строк:

Arguments = "/U /K \"echo これはテストです> output.txt\""; 

Это консольное окно, которое не может отображать символы за пределами текущей кодовой страницы/выбранного шрифта. Тем не менее, я предполагаю, что вы не хотите вызывать эхо, поэтому это полностью зависит от того, как написана программа, которую вы вызываете.

Некоторой справочная информация: C или C++ программы, которые используют «узкие» (кодовую страницу) точки входа, например main(int argc, char** argv), а не «широкие» точек входа (UTF-16), wmain(int argc, wchar_t** argv), вызываются заглушкой который преобразует командную строку в системную кодовую страницу, которая не может быть UTF-8.

На сегодняшний день лучшим вариантом является изменение программы на использование широкой точки входа и просто получение того же UTF-16, что и в вашей строке .NET. Если это не представляется возможным, то один трюк вы можете попробовать, чтобы передать его UTF-16 командную строку, что при преобразовании в системной кодовой странице является UTF-8 для символов, которые вы хотите его использовать:

Arguments = Encoding.Default.GetString(Encoding.UTF8.GetBytes(args)); 

РИСКОВАННАЯ Coder : Не удивляйтесь, если это ужасно неправильно на вашей или чужой машине, это зависит от того, насколько все возможные байты действительны в текущей кодовой странице системы, системная кодовая страница не отличается от того, когда была запущена ваша программа, запущенная вами программа не используя данные для любой зависимой от кодирования функции Windows (те, у которых есть суффиксные версии A, W) и т. д.

+0

Да, я вижу, что программы получают свои командные строки в юникоде, но то, что я не знаю, является ли параметр StartInfo.Arguments класса Process распространяет значение на приложение в юникоде. В моем тестировании это не похоже. –

+0

@Patrick: Чтобы быть полностью точным, когда программа была запущена, необработанное значение, которое он получает из Windows, всегда находится в Юникоде. В зависимости от того, как он написан, он может иметь это преобразование в кодовую страницу системы, прежде чем он ее увидит. –

+0

Если вы используете 'main' для точки входа, вы все равно можете получить аргументы UTF-16 с помощью GetCommandLine (http://msdn.microsoft.com/en-us/library/ms683156(VS.85).aspx). Так работает QCoreApplication Qt в Windows. – Patrick