Vous avez peut-être déjà voulu afficher dans Softimage via Python un message du type “Procédure non trouvée” ou encore écrire dans un bouton “Définir un accès” et vous vous êtes retrouvé avec “Procédure non trouvée” et “Définir un accès”. Voir même vous avez eu un message d’erreur pour avoir simplement écrit un commentaire avec un accent. Nous allons comprendre ici pourquoi les caractères avec accent peuvent être mal interprétés par Softimage et nous en déduirons comment les afficher en toute circonstance.
La clé de tout cela réside dans le fait que depuis quelques versions (sans doute depuis la V6 mais je ne suis pas très sûr), Softimage utilise pour coder ses chaînes de caractères le système “unicode”. C’est quoi ça ? Tout est expliqué sous ce lien dans Wikipédia.
Pour ce qui nous concerne, cela va dépendre de la version de Python utilisée:
- Version 2.x: l’unicode est reconnu mais n’est pas utilisé directement dans les chaines de caractères de type “string”
- Version 3.x: l’unicode est le format utilisé pour les chaînes de caractère de type “string”
En gros, vous aurez moins de problème avec Python 3.x mais vous n’êtes pas pour autant à l’abri de problèmes. Le mieux est d’abord de bien comprendre et on verra que ce n’est pas compliqué à corriger.
Avec Python 2.x
Par défaut, si vous tapez et lancez ce script:
Application.LogMessage(“pépé”)
Softimage affiche:
# INFO : pépé
Moralité, on sait que Sotimage n’aime pas les accents (en tout cas, pour l’instant…)
Retirons les accents pour un moment le temps de voir autre chose :
name = “null”
Application.LogMessage(name)
Application.LogMessage(type(name))
Softimage affiche:
# INFO : null
# INFO : <type ’str’>
Jusque là, rien d’étrange. Tout est normal.
Créons maintenant un null (appelé “null”) et tapons le script suivant
oNull = Application.dictionary.GetObject(“null”) #oNull représente notre Null
Application.LogMessage(oNull.Name)
Application.LogMessage(type(oNull.Name))
Softimage affiche:
# INFO : null
# INFO : <type ‘unicode’>
Tiens, ça change ! Dans le premier exemple, nous avions une chaine de type “string” et dans l’autre, nous avons une chaine de type “unicode”.
Bien que les 2 exemples renvoie en apparence la même chose, ils ne renvoient pas la même chose puisque les types sont différents. Si on compare les 2, on devrait avoir une différence. Pourtant…
oNull = Application.dictionary.GetObject(“null”)
name = “null”
Application.LogMessage(oNull.Name == name)
Pourtant Softimage nous renvoie bien:
# Info : True
En fait, Python parle en 2 langages sans qu’on s’en rende compte et permet de comparer des type ’string’ avec des types ‘unicode’ sans problème, en tout cas tant qu’il n’y a pas de caractères spéciaux. Pourtant il m’est arrivé que la comparaison entre un nom d’objet et une chaine de caractère de type ’string’ ne me renvoie pas True alors que cela aurait dû être le cas puisqu’en apparence c’était le même texte. Sans doute était-ce parce que j’étais dans un contexte particuliers puisque dans PyQt mais ayant corrigé le problème depuis, je ne puis dire avec certitude que c’était à cause de cela. Quoiqu’il en soit, vous êtes prévenu…
Donc, si on veut être “clean” et parfaitement dans les règles, il vaut mieux convertir nos “strings” en “unicode” (puisque Softimage ne comprend que l’unicode). Et pour se faire, c’est très simple: il suffit d’ajouter un ‘u’ devant toute chaine de caractère comme ceci :
name = u”null”
Application.LogMessage(name)
Application.LogMessage(type(name))
Softimage affiche :
# INFO : null
# INFO : <type ‘unicode’>
Et d’une pierre, deux coups, puisque ainsi on peut très bien écrire des accents:
Application.LogMessage(u”pépé”)
Softimage affiche:
# INFO : pépé
Avec Python 3.x
Et bien là, c’est beaucoup plus simple puisque nos chaines de caractères de type ’string’ sont déjà en unicode. Donc toujours avec notre Null si on écrit :
oNull = Application.dictionary.GetObject(“null”) #oNull représente notre Null
Application.LogMessage(oNull.Name)
Application.LogMessage(type(oNull.Name))
Softimage affiche:
# INFO : null
# INFO : <type ’str’>
Dans Python 3, le type ‘unicode’ n’existe plus et donc on n’a plus besoin de mettre ‘u’ devant une chaîne de caractères (ça devient même une erreur de syntaxe). De ce fait, on n’a plus à y penser :
Application.LogMessage(“pépé”)
Softimage affiche:
# INFO : pépé
Problème résolu ? pas tout à fait…
Si vous écrivez votre code dans un éditeur externe, vous pouvez quand même avoir des erreurs une fois exécuté dans Softimage. Pour cela, il faut vérifier avec quel encodeur le texte de votre script est codé.
Si vous utilisez comme moi Notepad++ (qui entre nous est très bon), vous avez un menu Encodage dans le menu supérieur. Si vous l’ouvrez, il vous indique l’encodage de votre texte. Par défaut: ANSI . En principe, ça devrait fonctionné dans Softimage mais si vous encodez avec ISO 5589 – 1 par exemple qui est celui préconisé en France, là, ça va poser des problèmes puisque les caractères avec accent ne seront pas reconnu dans Softimage. Vous aurez beau convertir en unicode votre chaine , il ne saura même pas lire le code brut correctement (d’où des erreurs possibles même dans les commentaires).
Le mieux, et c’est mon conseil, est de choisir directement un encodage unicode. Ainsi vous serez tranquille et à l’abri de tout problème avec Softimage. Pour ce faire, vous pouvez choisir un encodeur de type UTF comme par exemple UTF-8.
Vous l’aurez certainement compris, la ligne d’encodage à indiquer en début de script de type :
# -*- coding: iso-8859-1 -*-
est maintenant vivement déconseillée puisque non comprise pas Softimage.