Comment décoder cmd sortie correctement?
ProcessStartInfo startInfo = new ProcessStartInfo("CMD.exe");
startInfo.Arguments = "/c " + URL;
Process p = new Process();
startInfo.RedirectStandardInput = true;
startInfo.UseShellExecute = false;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.CreateNoWindow = true;
p = Process.Start(startInfo);
string original = p.StandardOutput.ReadToEnd();
string result1 = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(original));
string result2 = Encoding.BigEndianUnicode.GetString(Encoding.BigEndianUnicode.GetBytes(original));
string result3 = Encoding.Unicode.GetString(Encoding.Unicode.GetBytes(original));
string result4 = Encoding.UTF32.GetString(Encoding.UTF32.GetBytes(original));
string result5 = Encoding.UTF7.GetString(Encoding.UTF7.GetBytes(original));
string result6 = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(original));
cmd sortie contient russe lettres, qui ne peut être décodé correctement avec tous les encodages ce que j'ai essayé. S'il vous plaît aider.
J'ai essayé:
startInfo.StandardOutputEncoding = Encoding."all possible encodings";
mais aucune aide.
des idées?
- Regardez ce que vous faites! Vous n'êtes pas trans-codage quoi que ce soit. Si vous utilisez l'un de UTFs, vous obtenez tout simplement exactement la même que la chaîne d'origine. Votre "original" est déjà une chaîne! Et il devrait déjà être la chaîne de droite, check it up. Plus généralement, vous avez besoin de lire des octets brutes (pas de caractères!) et puis l'encoder ensuite, en supposant que certains d'encodage. Codant pour faire une chaîne de tableau de byte, et inversement, pas de chaîne de chaîne de caractères.
- La conversion de la chaîne après la lecture, il est trop tard. Vous devez attribuer le startInfo.StandardOutputEncoding de la propriété. Essayez une page de code russes, afin 1251, 855, 866, 20866. Passer ce nombre à CultureInfo.GetCulture(). Yay pour l'Unicode.
- Wouldnt être mauvais pour la balise de la réponse correcte.
- Solution générale est ici: stackoverflow.com/questions/5910573/...
Vous devez vous connecter pour publier un commentaire.
Vieille question, mais aucune réponse correcte.
Ici, il est:
850 est le standart cmd-page. Ainsi, l'utilisateur qui est à l'aide de l'application seront les personnages, comme il pourrait s'attendre lors de l'utilisation de la ligne de commande lui-même.
Ce un a résolu tous les symboles des problèmes sur un allemand de l'OS pour moi.
Code OEM de pages:
437 (états-unis)
720 (arabe)
737 (en grec)
775 (Baltique)
850 (Multilingue Latin I)
852 (Latin II)
855 (Cyrillique)
857 (turc)
858 (Multilingue Latine I + Euro)
862 (en hébreu)
866 (russe)
Tout d'abord, vous devez définir une police correcte pour votre console. Exécuter l'application avec quelques pause (voir le deuxième exemple de code ci-dessous), cliquez sur "Propriétés" et de modifier la police de caractères.
Maintenant, vous devez définir l'encodage de trois choses: la première requête (pour être exécuté comme un processus enfant), c'est la sortie de la console de codage. Dans la relation parent-processus de demande, vous devez en faire de même si vous voulez voir le résultat, vous devez faire la même chose, mais vous devez également définir la norme d'encodage de sortie dans
System.Diagnostics.ProcessStartInfo
. Aussi, si vous utilisez une entrée, vous aurez besoin de trois choses en entrée.Sur mon système, tous les UTFs à l'exception de l'UTF-8, de lever une exception. Let it be: un seul UTF est probablement actuellement mis en œuvre (Windows 7 Pro, dans mon cas).
Tout d'abord, voyons comment pouvez-vous écrire l'application qui, tout simplement, sorties le texte Unicode:
Maintenant, nous allons voir comment démarrer un chili processus avec la redirection de sortie:
-Testé-
La solution pour utiliser le codage UTF8 pour écrire console est bonne si l'application de la console est le vôtre. Mais si vous utilisez standart Windows utilitaires comme "netsh" il ne l'aide pas.
Standart cmd pages de code est OEM.
Par exemple pour la langue russe:
Code OEM de pages:
437 (états-unis)
720 (arabe)
737 (en grec)
775 (Baltique)
850 (Multilingue Latin I)
852 (Latin II)
855 (Cyrillique)
857 (turc)
858 (Multilingue Latine I + Euro)
862 (en hébreu)
866 (russe)
Cela fonctionne pour moi:
Essayer si rien ne vient en aide!
Après beaucoup d'essayer & de la souffrance, voilà ce que j'ai trouvé: n'importe comment UTF8 votre flux de sortie est, peu importe comment vous définissez 65001, les choses ne fonctionnera pas jusqu'à ce que vous commencez un processus enfant à l'intérieur du processus enfant. Ridicule mais vrai.
Look:
Espère que cela vous permet d'économiser au moins autant de temps qu'il a pris de ma misérable vie!