Problème de conversion ASCII/ANSI

Une difficulté, une précision posez vos questions

Modérateur : WIN32-[GG]

Répondre
ThiuT
Batcheur occasionnel
Messages : 2
Enregistré le : 09 juin 2011 15:56

Problème de conversion ASCII/ANSI

Message par ThiuT »

Bonjour à tous !

Pour pouvoir attribuer 2 IP à ma carte réseau sans respecter la contrainte de les déclarer toutes les deux en statique (l'une provient d'un DHCP), j'essaie de créer un batch qui récupère les informations réseau au démarrage (1 adresse attribuée par le DHCP), redéclare cette même adresse en statique puis déclare la deuxième.

J'arrive a récupérer toutes les informations correctement (nom de la carte, ip et passerelle) grâce à des boucles de ce type :

Code : Tout sélectionner

ipconfig > ipconfig.txt

for /f "tokens=3,4,5,6,7" %%G in ('find "Connexion" ipconfig.txt') do (
    if %%K==: (set nom=%%G %%H %%I %%J) else (set nom=%%G %%H %%I %%J %%K)
)
... et deux autres pour l'IP et la passerelle.

Mon problème est le suivant : si a l'issue de cette boucle je fais un echo %nom%, j'obtiens Connexion au rùseau local 2 au lieu de Connexion au réseau local 2... (le ù est majuscule mais je ne sais pas le refaire :p)

Coincidence : "ù" majuscule en ASCII = 233 et "é" en ANSI =... 233 !

Bref, la commande d'ajout d'une IP :

Code : Tout sélectionner

netsh in ip add address "%nom%" %ipadress% 255.255.255.0 %passerelle%
renvoie une erreur "Nom de carte réseau invalide", et je suis bloqué !

J'ai pensé à une solution dans la boucle for de récupération du nom, du type :

Code : Tout sélectionner

if %%I=r?seau set I=réseau
mais ce code ne fait rien pour deux raisons :
- la condition %%I=r?seau n'est jamais vraie, alors que par exemple %%G=Connexion est vraie...
- la commande set I=réseau ne génère pas d'erreur mais ne fait rien. J'ai lu quelque part qu'il fallait rajouter la ligne SETLOCAL ENABLEDELAYEDEXPANSION pour manipuler les variables dans une boucle, mais je ne trouve rien sur la bonne syntaxe.

Merci d'avance si quelqu'un à une solution ! :D
ThiuT
Batcheur occasionnel
Messages : 2
Enregistré le : 09 juin 2011 15:56

Re: Problème de conversion ASCII/ANSI

Message par ThiuT »

Alors désolé de vous avoir dérangé pour rien mais moins d'une heure après avoir posté, j'ai un peu réfléchi et trouvé une solution (certes barbare mais qui marche ^^). Je la poste ici au cas où d'autres personnes rencontreraient le même problème.

En fait c'est très simple : lorsque j'écris mon batch avec Notepad++, encodé en ANSI, chaque caractère est codé par une valeur de la table ANSI. Lorsque le batch s'exécute et que cmd veut afficher quelque chose. Il récupère les mêmes valeur et regarde le caractère correspondant sur la table ASCII pour l'afficher. D'où l'erreur.

Solution barbare : écrire le batch de manière à ce que les numéros qui codent les caractères soient correctement interprétés ! (bien sur l'idée n'est pas de tout réécrire, seuls les caractères spéciaux à afficher posent problème).

Dans mon cas, la confusion se faisait entre "Ú" (233 en ASCII, 218 en ANSI) et "é" (130 en ASCII, 233 en ANSI). Ainsi dans la phrase "Connexion au réseau local 2", ma variable %nom% récupérait à l'emplacement du "é" le code 233, qui était ensuite réinterprété comme un "Ú".

Je voulais donc remplacer le caractère "Ú" par "é", et la ligne de commande pour ça est :

Code : Tout sélectionner

set nom=%nom:é=‚%
Pourquoi ? parce que si je convertis en code ANSI, cela correspond à remplacer 233 par 130. Donc lorsque ce remplacement est interprété via une table ASCII, "Ú" (233) devient "é" (130) !

Je reste ouvert à toute solution plus fine et plus stable ^^
Répondre