2010-10-22 8 views
1

J'ai une application .Net qui déclenche un processus, en passant une longue liste d'arguments via Process.StartInfo.Arguments. Le nouveau processus ne peut gérer que les caractères de 8 bits dans les arguments passés à sa fonction main(). Par conséquent, j'ai codé la chaîne dans Process.StartInfo.Arguments afin que chaque caractère soit une valeur 8 bits.Encodage de Process.StartInfo.Arguments

Le problème est que le nouveau processus ne voit pas les mêmes valeurs de 8 bits que j'ai utilisées. Pour les valeurs inférieures à 128, la valeur est transmise sans être importée. Les autres valeurs sont modifiées d'une manière ou d'une autre, et en fait, la liste d'arguments vue par le nouveau processus est souvent plus longue que celle passée.

Quel encodage est utilisé pour traduire les arguments lors de leur transmission au nouveau processus? Puis-je modifier ce codage?

Je vois les codages associés à la sortie standard du processus et à l'erreur standard; Je suppose que ce sont hors de propos.

Répondre

1

Ce n'est pas quelque chose que vous pouvez corriger dans le code .NET. La classe de processus .NET ainsi que Windows utilise Unicode. La conversion d'Unicode en une chaîne de caractères de 8 bits se produit dans la bibliothèque d'exécution C intégrée dans le programme que vous avez démarré. Cette conversion est basée sur la page de codes système actuelle, elle utilise la fonction API WideCharToMultiByte() avec CodePage = CP_ACP. Il n'y a aucun moyen de modifier cette conversion, à moins de modifier la page de codes du système. Ce qui a des effets drastiques sur l'ensemble du système d'exploitation.

Bien sûr, il s'agit d'une conversion avec perte, elle ne peut gérer que les caractères définis dans la page de codes. Si vous lui transmettez un argument contenant un caractère Unicode qui ne peut pas être représenté dans la page de code, le programme verra un point d'interrogation dans cette chaîne. Aucune quantité de manipulation de chaîne que vous pourriez faire dans votre code .NET ne peut empêcher ceci, à court d'omettre ou de substituer ce caractère. Mais alors vous ne passez plus la même corde.