-RÉSOLU- pour le¸moment Afficher des caractères latin sur une écran TFT?

Bonjour Communauté,

J'utilise une carte graphique (Ecran LCD TFT 3.2 “et blindage pour Arduino DUE, avec contrôle SD & Touch)
avec une carte Arduino DUE. La bibliothèque Adafruit-GFX est installée.

J'aimerais pouvoir imprimer des caractères latins (èéÉÈ...) et autres caractères avec des accents sur cet écran. Quelle bibliothèque dois-je utiliser ou additionner pour afficher ces caractères ?

Merci
Je ne suis pas un habitué des forums, si je ne suis pas au bon endroit; S.V.P. aiguillez-moi.

Pierre Carignan

cf cette discussion par exemple

Comm je suis un nouveau; je vais parcourir ta suggestion de lecture pour apprendre.
Mais à première vue, je crois que je me suis mal exprimé.
Ce n'est pas le type de font mais plutôt une table de caractère étendue que j'ai besoin
pour afficher les caractères ayants des accent.pouvoir afficher les cratères d'un clavier
français sur l'écran. Présentement si je fait une commande

tft.print("aàeèeé");

seul les caractères du clavier US s'écrive correctement à l'écran.

Peut-on ajouter ces caractère français à la bibliothèque ?

Pierre

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...)

Je vois c'est pas simple
j'ai du matériel pour m'amuser un peu.

Je vais étudier encore je croyais qu'il était possible de le faire seulement qu'en ajoutant une table
contenant les caractère euros, et de taper dans la string les caractères pour qu'ils soient interprétés
comme tel et affichés sur l'écran sans plus.

Merci

Pierre

Une police fait la correspondance entre le Code du symbole et son dessin. La librairie que vous utilisez ne connaît les codes que sur un octet, les symboles que vous taperez dans lIDE serint sur 1, 2 ou 3... donc soit vous redessinez une police et remplacez des caractères que vous voulez et utilisez leur code, soit faut bosser un peu plus

Les librairies pour TFT, c'est la galère de ce point de vue.

Rien que pour la librairie UTFT, les police de caractère n'ont pas le même codage.
Le caractère ° ne s'affiche pas avec le même code ASCII suivant la police.
J'ai jeté l'éponge. Trop merdique.

Quand cela dépasse un certain niveau, une RASPBERRY PI, un OS qui se respecte, du HTML, de l'UTF8, etc.
Du standard, quoi ...

Ou alors bidouiller à l'infini.