2010-04-13 8 views
8

Czy możesz używać ciągów UTF-8 jako argumentów dla StartInfo?Czy Process.StartInfo.Arguments obsługuje ciąg znaków UTF-8?

Próbuję przekazać UTF-8 (w tym przypadku japoński ciąg) do aplikacji jako argument konsoli.

Coś takiego (to tylko przykład! (By cmd.exe być zwyczaj aplikacja))

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

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

Wykonanie to wydaje się tracić ciąg UTF-8 i cała aplikacja jest cel widzi " Echo ?????????"

Podczas wykonywania tego polecenia bezpośrednio w wierszu poleceń (przez wklejenie argumentów) aplikacja docelowa otrzymuje ciąg poprawnie, mimo że sam wiersz polecenia nie wyświetla go poprawnie.

Czy muszę zrobić coś specjalnego, aby włączyć wsparcie dla UTF-8 w argumentach, czy to nie jest obsługiwane?

Odpowiedz

1

To całkowicie zależy od programu, który próbujesz uruchomić. Klasa Process obsługuje w pełni Unicode, podobnie jak system operacyjny. Ale program może być stary i używać 8-bitowych znaków. Użyje funkcji GetCommandLineA() do pobrania argumentów wiersza poleceń, wersji ANSI natywnej funkcji API Unicode GetCommandLineW(). A to tłumaczy ciąg znaków Unicode na 8-bitowe znaki przy użyciu domyślnej strony kodowej systemu skonfigurowanej w Panelu sterowania + Opcje regionalne i językowe, Język dla programów innych niż Unicode. WideCharToMultiByte() przy użyciu CP_ACP.

Jeśli to nie jest japońska strona kodowa, to tłumaczenie powoduje pojawianie się znaków zapytania, ponieważ japońskie glify mają tylko kod na japońskiej stronie kodowej. Przełączanie strony kodowej systemu zazwyczaj nie jest bardzo pożądane dla osób nie będących Japończykami. Utf8 na pewno nie zadziała, program nie będzie ich oczekiwał. Rozważ uruchomienie tego programu na maszynie wirtualnej.

1

Właśnie stworzyłem aplikację Windows Forms, która wyświetla Environment.CommandLine w RichTextBox, a ciąg znaków został wyświetlony poprawnie, więc możliwe jest przekazanie w ten sposób ciągu znaków Unicode.

Myślę, że mój system operacyjny domyślnie używa strony kodowej 1252, więc nie mogę wyświetlać tych znaków w wierszu polecenia nawet podczas wklejania argumentów, tak jak zrobiłeś.

+0

czy przekazałeś argumenty do swojej aplikacji, uruchamiając aplikację, używając Process i ProcessStartInfo lub bezpośrednio z wiersza poleceń? –

+0

Użyłem Process/ProcessStartInfo - zmieniłem tylko "cmd.exe" na "test.exe", która była moją aplikacją WinForm. –

0

Używane ciągi znaków [System.String lub zwykłe string] są oparte na Unicode. Tak, mogą utrzymać powyższe kodowanie.

Sprawdźcie here

Trzeba sprawdzić ustawienia OS powiązanych (strony kodowe, języki itp)

+0

Wiem, że łańcuchy obsługują kod Unicode - po prostu nie jestem pewien, czy właściwość Arguments w ProcessStartInfo prawidłowo propaguje to do aplikacji wykonującej. Nie wydaje się. –

4

Programy odbierają swoje wiersze poleceń w UTF-16, w tym samym kodowaniu jako ciągi .NET:

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

Jest to okno konsoli, w którym nie można wyświetlać znaków poza bieżącą stroną kodową/wybraną czcionką. Jednak zakładam, że nie chcesz wywoływać echa, więc to zależy całkowicie od tego, jak program, do którego dzwonisz, jest zapisany.

Niektóre informacje tło: C lub C++ programy, które korzystają z „wąskim” (system kodów strona) punkty wejścia, np main(int argc, char** argv), raczej niż „szerokich” (UTF-16) punktów wejścia, wmain(int argc, wchar_t** argv), nazywane są przez odgałęzienie który konwertuje wiersz poleceń na stronę kodową systemu - która nie może być UTF-8.

Zdecydowanie najlepszą opcją jest zmiana programu na szeroki punkt wejścia i uzyskanie tego samego UTF-16, co w łańcuchu .NET. Jeśli nie jest to możliwe, a następnie jeden trik można spróbować jest przekazanie mu UTF-16 wiersza poleceń, że po przekonwertowaniu do strony kodowej systemu jest UTF-8 dla znaków chcesz go używać:

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

Caveat Coder : Nie zdziw się, jeśli pójdzie to okropnie źle na twoim czy innym komputerze, zależy to od tego, czy każdy bajt jest ważny na aktualnej stronie kodowej systemu, strona kodowa systemu nie różni się od tego, kiedy uruchomiłeś program, program, który używasz nie używa danych do jakiejkolwiek zależnej od kodowania funkcji Windows (z wersjami A, W, suffixed) i tak dalej.

+0

Tak Widzę, że programy otrzymują swoje wiersze poleceń w unicode, ale nie wiem, czy klasa StartInfo.Arguments klasy Process może propagować wartość do aplikacji w unicode. W moim testowaniu nie wydaje się. –

+0

@Patrick: Aby być całkowicie dokładnym, po uruchomieniu programu wartość nieprzetworzona otrzymywana z systemu Windows jest zawsze w kodzie Unicode. W zależności od tego, jak jest napisane, może to zostać przekonwertowane na stronę kodową systemu, zanim ją zobaczy. –

+0

Jeśli użyjesz 'main' dla punktu wejścia, nadal możesz uzyskać argumenty UTF-16 używając GetCommandLine (http://msdn.microsoft.com/en-us/library/ms683156(VS.85).aspx). W ten sposób QCoreApplication Qt działa w systemie Windows. – Patrick

Powiązane problemy