vous vous êtes bien exprimé. (mais lisez les règles du forum quand même)
pas de réponse simple à mon avis (j'ai jamais trop poussé car pas le besoin)..
jetez un oeil ici et là pour voir comment un espagnol a résolu son problème par un petit hack (et pas une police)
ce qu'il faut savoir:
Ce qui est affiché pour un caractère donné dépend de la police de caractère et quels "symboles" cette police implémente.
Quand vous tapez une chaîne dans l'iDE comme "aàeèeé"
, elle est codée en mémoire en UTF8 par l'éditeur et c'est aussi géré par le compilateur. le codage UTF8 va utiliser 1, 2 ou 3 octets pour représenter un symbole.
Par exemple si vous compilez ce code
const char cString[] = "µ € é"; // 5 symboles
void setup() {
Serial.begin(115200);
size_t longueur = strlen(cString);
Serial.print("Longeur = "); Serial.println(longueur);
for (size_t i = 0; i < longueur; i++) {
Serial.print(i);
Serial.print("\t0x");
Serial.println((uint8_t)cString[i], HEX);
}
}
void loop() {}
vous verrez dans la console
[color=purple]
Longeur = 9
0 0xC2
1 0xB5
[color=red]2 0x20[/color] ---> espace
3 0xE2
4 0x82
5 0xAC
[color=red]2 0x20[/color] ---> espace
7 0xC3
8 0xA9
[/color]
le code 0x20 c'est l'espace et donc ce qu'on a à côté c'est le codage des autres symboles
le symbole 'µ' a été codé sur 2 octets: 0xC2B5
le symbole '€' a été codé sur 3 octets: 0xE282AC
le symbole 'é' a été codé sur 2 octets: 0xC3A9
c'est pour cela que la fonction strlen() vous dit 9 'caractères' alors que l'on avait 3 symboles et 2 espaces, ça devrait faire 5..
Pourquoi je vous raconte cela? parce que la librairie que vous utilisez est construite sur des polices où les caractères sont représentés sur une seul octet, et pour lesquels les polices non contiennent que des caractères identifiés par un code à 7 bits, soit les caractères imprimables de la table ASCII usuelle
donc si vous appelez une fonction de la librairie avec la chaîne "µ € é", la librairie comprend une suite de 9 octets tels que montrés dans le code ci dessus... et c'est la zone.
Il existe un codage différent d'UTF8 qui se rapproche un peu de ce que l'on voudrait. Il s'agit de ce que l'on nomme latin-1 ou ISO/CEI 8859-1 de son petit nom selon la nomenclature. Il s'agit d'un alphabet qui consiste en 191 caractères de l’alphabet latin, chacun d’entre eux étant codé sur 8 bits et qui reprend et partage le codage des caractères imprimables de la table ASCII usuelle.
Donc si vous aviez une chaîne codée en latin-1, pour les caractères dont le code serait inférieur à 127, on aurait un dessin qui correspond et il suffirait que la police de caractère associée décrive comment "peindre" les caractères dont le code est supérieur à 128 pour couvrir nos besoins européens.
il faudrait pour bien faire un moyen de passer des ce codage multi-octets vers un codage - quand c'est possible - sur un octet.. et il se trouve que ce n'est pas super compliqué et même documenté ici
Mais malheureusement ce n'est pas le codage par défaut de la librairie Adafruit qui utilise le "Code page 437" avec un bug (qu'ils ont contourné en rajoutant une fonction...)