Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Resultat d'une commande DOS en caractères windows

7 réponses
Avatar
Luis
Bonjour,

C'est une question probablement récurante dont j'ai du mal à trouver une
réponse claire dans les forum.

Avec la commande Process.start(), j'exécute un commande DOS dont je récupère
le resultat dans une chaine avec Process.StandardOutput.ReadToEnd().
La chaine resultat contient, par exemple, des caractères accentués dans le
DOS, mais illisibles dans mon application Windows.

Par quel moyen puis-je convertir cette chaine de caractères DOS en chaine de
caractères lisibles sous windows ?

Je me doute qu'il faut utiliser la classe Encoding, mais j'ai déjà des
difficultés à savoir de quel codage je dois partir (DOS) et vers quel codage
je doit arriver (windows).
En effet, j'en suis resté aux vieilles fonction API du style CharToOem et
CharToAnsi.

Un petit code exemple serait le bienvenu pour mettre un peu d'ordre dans mes
neurones.

Merci d'avance.
Luis

7 réponses

Avatar
Fred
"Luis" a écrit dans le message de
news:
Bonjour,



Bonjour,

Avec la commande Process.start(), j'exécute un commande DOS dont je
récupère
le resultat dans une chaine avec Process.StandardOutput.ReadToEnd().
La chaine resultat contient, par exemple, des caractères accentués
dans le
DOS, mais illisibles dans mon application Windows.

Par quel moyen puis-je convertir cette chaine de caractères DOS en
chaine de
caractères lisibles sous windows ?



Le mieux est de démarrer le process en lui affectant un objet
ProcessStartInfo dans lequel on précise la propriété
StandardOutputEncoding.

Sinon, sur un système Français, l'encodage à utiliser est généralement
OEM 850
System.Text.Encoding.GetEncoding(850)

--
Fred

Avatar
Luis
"Fred" wrote:

"Luis" a écrit dans le message de
news:
> Bonjour,

Bonjour,

> Avec la commande Process.start(), j'exécute un commande DOS dont je
> récupère
> le resultat dans une chaine avec Process.StandardOutput.ReadToEnd().
> La chaine resultat contient, par exemple, des caractères accentués
> dans le
> DOS, mais illisibles dans mon application Windows.
>
> Par quel moyen puis-je convertir cette chaine de caractères DOS en
> chaine de
> caractères lisibles sous windows ?

Le mieux est de démarrer le process en lui affectant un objet
ProcessStartInfo dans lequel on précise la propriété
StandardOutputEncoding.

Sinon, sur un système Français, l'encodage à utiliser est généralement
OEM 850
System.Text.Encoding.GetEncoding(850)

--
Fred





Merci Fred pour ces renseignements.
Le Codage pour windows est aussi le "Windows-1252".

J'ai fait des essais de convertion du retour de la commande DOS, de OEM850
vers Windows-1252, sans succès.

Je viens d'essayer ton conseil, a savoir d'utiliser la propriété
StandardOutputEncoding=Encoding.GetEncoding(1252) mais le DOS ne tient pas
compte de ce paramètre.

J'ai du me résoudre à utiliser les fonctions API OemToChar (dos vers
windows) et CharToOem (windows vers dos).

Je laisse ici le code que j'ai trouvé sur un site. Cela pourrait servir à
d'autres.

[DllImport("user32.dll")]
static extern bool OemToCharA(char[] lpszSrc, [Out] StringBuilder lpszDst);
public static string OemToChar1(string str){
if( string.IsNullOrEmpty(str) ) return str;
StringBuilder strBuilder = new StringBuilder(str.Length);
OemToCharA(str.ToCharArray(), strBuilder);
return strBuilder.ToString();
}

[DllImport("user32.dll")]
static extern bool CharToOemA(char[] lpszSrc, [Out] StringBuilder lpszDst);
public static string CharToOem1(string str){
if( string.IsNullOrEmpty(str) ) return str;
StringBuilder strBuilder = new StringBuilder(str.Length);
CharToOemA(str.ToCharArray(), strBuilder);
return strBuilder.ToString();
}

En C#, il faudra utiliser les fonctions OemToChar1 et CharToOem1.

Merci pour tout.
Luis
Avatar
Gilles Kohl [MVP]
On Sun, 16 Mar 2008 00:25:00 -0700, Luis wrote:

Merci Fred pour ces renseignements.
Le Codage pour windows est aussi le "Windows-1252".

J'ai fait des essais de convertion du retour de la commande DOS, de OEM850
vers Windows-1252, sans succès.



Je viens d'essayer ton conseil, a savoir d'utiliser la propriété
StandardOutputEncoding=Encoding.GetEncoding(1252) mais le DOS ne tient pas
compte de ce paramètre.



Cela fonctionne pour moi de la facon suivante:

ProcessStartInfo startInfo = new
ProcessStartInfo(@"c:tmpechotext.bat");
startInfo.StandardOutputEncoding = Encoding.Default;
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
Process p = Process.Start(startInfo);
string output = p.StandardOutput.ReadToEnd();

(echotext.bat a été crée sous DOS, et contient/écrit des charactères
accentués.)

La chaine "output" est bien lisible.

Ce qui semble marcher aussi est ceci:

static void Main()
{
ProcessStartInfo startInfo = new
ProcessStartInfo(@"c:tmpechotext.bat");
// startInfo.StandardOutputEncoding = Encoding.Default;
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
Process p = Process.Start(startInfo);
string output = p.StandardOutput.ReadToEnd();

Encoding OEMEncoding = Encoding.GetEncoding(850);
byte[] theBytes = OEMEncoding.GetBytes(output);
byte[] convertedBytes = Encoding.Convert(OEMEncoding,
Encoding.Default, theBytes);
string convertedOutput = Encoding.Default.GetString(convertedBytes);
Console.WriteLine(convertedOutput);
Console.ReadKey();
}
}

Amicalement,
Gilles.

Regards,
Gilles [MVP].

(Please reply to the group, not via email.
Find my MVP profile with past articles / downloads here:
http://www.gilleskohl.de/mvpprofile.htm)
Avatar
Luis
"Gilles Kohl [MVP]" wrote:

On Sun, 16 Mar 2008 00:25:00 -0700, Luis wrote:

>Merci Fred pour ces renseignements.
>Le Codage pour windows est aussi le "Windows-1252".
>
>J'ai fait des essais de convertion du retour de la commande DOS, de OEM850
>vers Windows-1252, sans succès.

>Je viens d'essayer ton conseil, a savoir d'utiliser la propriété
>StandardOutputEncoding=Encoding.GetEncoding(1252) mais le DOS ne tient pas
>compte de ce paramètre.

Cela fonctionne pour moi de la facon suivante:

ProcessStartInfo startInfo = new
ProcessStartInfo(@"c:tmpechotext.bat");
startInfo.StandardOutputEncoding = Encoding.Default;
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
Process p = Process.Start(startInfo);
string output = p.StandardOutput.ReadToEnd();

(echotext.bat a été crée sous DOS, et contient/écrit des charactères
accentués.)

La chaine "output" est bien lisible.

Ce qui semble marcher aussi est ceci:

static void Main()
{
ProcessStartInfo startInfo = new
ProcessStartInfo(@"c:tmpechotext.bat");
// startInfo.StandardOutputEncoding = Encoding.Default;
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
Process p = Process.Start(startInfo);
string output = p.StandardOutput.ReadToEnd();

Encoding OEMEncoding = Encoding.GetEncoding(850);
byte[] theBytes = OEMEncoding.GetBytes(output);
byte[] convertedBytes = Encoding.Convert(OEMEncoding,
Encoding.Default, theBytes);
string convertedOutput = Encoding.Default.GetString(convertedBytes);
Console.WriteLine(convertedOutput);
Console.ReadKey();
}
}

Amicalement,
Gilles.

Regards,
Gilles [MVP].

(Please reply to the group, not via email.
Find my MVP profile with past articles / downloads here:
http://www.gilleskohl.de/mvpprofile.htm)




Bonjour et merci pour ces exemples.

Dans mon cas, j'exécute la commande "MOUNTVOL" pour avoir la liste des
points de montages en cours. De plus, MOUNTVOL est plus un programme DOS
qu'une commande DOS. Les infos de départ étaient biaisées...je m'en excuse.

J'ai repris votre code et je l'ai exécuté. La sortie est encore en format
DOS, donc non lisible.

Pourriez-vous essayer votre code en remplacant "c:tmpechotext.bat" par
"mountvol" et me dire ce qu'il en sort. Peut-être ai-je un problème de
configuration.

Merci d'avance.

Luis
Avatar
Luis
"Gilles Kohl [MVP]" wrote:

On Sun, 16 Mar 2008 00:25:00 -0700, Luis wrote:

>Merci Fred pour ces renseignements.
>Le Codage pour windows est aussi le "Windows-1252".
>
>J'ai fait des essais de convertion du retour de la commande DOS, de OEM850
>vers Windows-1252, sans succès.

>Je viens d'essayer ton conseil, a savoir d'utiliser la propriété
>StandardOutputEncoding=Encoding.GetEncoding(1252) mais le DOS ne tient pas
>compte de ce paramètre.

Cela fonctionne pour moi de la facon suivante:

ProcessStartInfo startInfo = new
ProcessStartInfo(@"c:tmpechotext.bat");
startInfo.StandardOutputEncoding = Encoding.Default;
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
Process p = Process.Start(startInfo);
string output = p.StandardOutput.ReadToEnd();

(echotext.bat a été crée sous DOS, et contient/écrit des charactères
accentués.)

La chaine "output" est bien lisible.

Ce qui semble marcher aussi est ceci:

static void Main()
{
ProcessStartInfo startInfo = new
ProcessStartInfo(@"c:tmpechotext.bat");
// startInfo.StandardOutputEncoding = Encoding.Default;
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
Process p = Process.Start(startInfo);
string output = p.StandardOutput.ReadToEnd();

Encoding OEMEncoding = Encoding.GetEncoding(850);
byte[] theBytes = OEMEncoding.GetBytes(output);
byte[] convertedBytes = Encoding.Convert(OEMEncoding,
Encoding.Default, theBytes);
string convertedOutput = Encoding.Default.GetString(convertedBytes);
Console.WriteLine(convertedOutput);
Console.ReadKey();
}
}

Amicalement,
Gilles.

Regards,
Gilles [MVP].

(Please reply to the group, not via email.
Find my MVP profile with past articles / downloads here:
http://www.gilleskohl.de/mvpprofile.htm)





Re-bonjour,

Je m'aperçois également que dans votre exemple, vous avez créé une
Application console et non une Application Windows.

Cela explique sûrement que votre exemple fonctionne.

Merci.
Luis
Avatar
Fred
"Luis" a écrit dans le message de
news:
"Fred" wrote:

"Luis" a écrit dans le message de
news:





Le Codage pour windows est aussi le "Windows-1252".



Oui mais la console de commande est par défaut en OEM 850 sauf si tu
fais un CHCP.

J'ai fait des essais de convertion du retour de la commande DOS, de
OEM850
vers Windows-1252, sans succès.



Voilà un bout de code fait rapidement en VB et qui fonctionne.

p = New Process
psi = New ProcessStartInfo("mountvol.exe")
psi.StandardOutputEncoding =
System.Text.Encoding.GetEncoding(850)
psi.RedirectStandardOutput = True
psi.UseShellExecute = False
p.StartInfo = psi
p.Start()
Dim s As String = p.StandardOutput.ReadToEnd
Me.TextBox1.Text = s


--
Fred

Avatar
Luis
"Fred" wrote:

"Luis" a écrit dans le message de
news:
> "Fred" wrote:
>
>> "Luis" a écrit dans le message de
>> news:

> Le Codage pour windows est aussi le "Windows-1252".

Oui mais la console de commande est par défaut en OEM 850 sauf si tu
fais un CHCP.

> J'ai fait des essais de convertion du retour de la commande DOS, de
> OEM850
> vers Windows-1252, sans succès.

Voilà un bout de code fait rapidement en VB et qui fonctionne.

p = New Process
psi = New ProcessStartInfo("mountvol.exe")
psi.StandardOutputEncoding =
System.Text.Encoding.GetEncoding(850)
psi.RedirectStandardOutput = True
psi.UseShellExecute = False
p.StartInfo = psi
p.Start()
Dim s As String = p.StandardOutput.ReadToEnd
Me.TextBox1.Text = s


--
Fred





Bonjour,

Merci. Cela fonctionne.
Vous m'aviez donné l'info à votre première réponse mais je n'ai pas su
l'exploiter correctement.

Merci à vous et à Gilles.
Luis.