Bonjour,
J'ai peut-être une solution qui, même si elle est limitée, devrait rendre le service dans pas mal de cas simples.
Sous forme de library (pardon : librairie ) que je posterai ce soir.
Comme vous, j'ai été confronté à la frustration de ne pas pouvoir profiter de toute la richesse de la langue de Molière.
Cette librairie a été écrite pour répondre à mes besoins, dont voici la description :
A la base j'ai de tas de messages en bon français, avec caractères accentués.
Des trucs du style :
const char toto[] = "où sont passés mes accents?";
(mettons de côté les considérations liées à l'utilisation de PROGMEM, ce n'est pas le sujet ici)
Depuis l'arduino, je peux envoyer un même message :
- sur un terminal série d'un PC (celui de l'IDE Arduino)
- sur un écran LCD 2x16 ou 4x20
- dans des pages HTML retournées par un mini serveur web embarqué
Et pas question de renoncer aux caractères accentués.
Se posait alors la question de convertir au bon format le contenu de la RAM contenant le message, avant envoi vers le media de restitution.
De surcroît, mon arduino dialogue avec des systèmes tiers : PC Windows / PC Linux / Android pour lesquels je produis aussi du code, contenant les mêmes messages.
Mon char toto[] et ses frères sont définis dans un fichier unique utilisé par tous mes compilos.
Mais dans le résultat compilé (et donc dans la RAM à l'exécution du programme), ces messages peuvent être stockés dans différents formats, selon l'IDE et/ou le compilo.
Du coup, je voulais aussi que mes fonctions de conversion soient multi-plateformes.
Au final, j'ai fabriqué une fonction qui a en entrée :
- un texte en char[]
- le format cible souhaité, parmi UTF-8 / UNICODE / ASCII / HTML / suppression des accents
et qui délivre un char[] assurant la conversion des caractères accentués dans le format cible.
La fonction s'adapte automatiquement au format de la source, selon ce qu'elle trouve dedans.
Au final cela donne une librairie simple d'utilisation.
Par exemple :
void setup()
{
const char toto[] = "où sont passés mes accents?";
Serial.begin(9600);
Serial.println(conversionUnicode(toto)); // Pour affichage sur l'IDE Arduino
}
Evidemment il y a une limite, sinon ce serait trop beau : je ne gère que les 15 caractères accentués utilisés dans les mots valides de la langue française.
à â ä ç é è ë ê ï î ô ö û ü ù
Cette librairie n'est pas écrite pour la postérité.
Les puristes trouveront probablement qu'elle est incomplète, mais elle a l'avantage d'être simple et de répondre parfaitement à mon besoin.
Elle doit pouvoir être complétée avec quelques autres caractères spéciaux, par exemple si votre coeur souffre d'une trop grande distance entre ses voyelles.
a+