.print() trasformna in unicode i caratteri extra 128

Quando cerco di stampare sul TFT, i caratteri oltre il 128 me li trasforma in unicode, anche se io ho una tabella ascii fino a 256.
tft.print("ÀÈÌÒÙ");

tft.print('À', HEX);
C380
tft.print('È', HEX);
C388
tft.print('Ì', HEX);
C38C

Facendo ricerche mi sembra che solo rimuovendo il C3, dovrebbe corrispondere alla mia tabella, però c'è un problema.

Se cambio il mio write in uint16_t mi da errore perchè il print arduino si aspetta un unit8_t

Quindi l'ide compila il carattere in due byte, ma poi il print può solo mandare il primo al write.

Possibile ?
E c'è una soluzione ?

Quì dicono che si può cambiare il preprocessore, ma non ci ho capito nulla.

Iniziamo dall'inizio: quale TFT stai usando e con quale libreria?
Secondo, non ho avuto molto a che fare con display TFT ma a me non sembra che abbiano conoscenza di encoding o code page per i caratteri extra, ma possano lavorare solo con codifica ASCII (0-127).
Se così fosse anche per il tuo, temo che nelle stringhe dovrai sostituire le accentate con lettera+apice (es. "À" -> "A'") oppure evitare di usare le maiuscole.

Beh se "tft.print('À', HEX);" ti dà "C380", rimuovendo il C3 resta solo 0x80 ossia 128 che corrisponde a "ç" quindi direi che no, non corrisponde.
Nella tabella US-ASCII (sempre se il tuo display supporta questa codifica) ci sono queste corrispondenze per le vocali maiuscole accentate:
"À" = 192 = 0xC0
"È" = 200 = 0xC8
"Ì" = 204 = 0xCC
"Ò" = 210 = 0xD2
"Ù" = 217 = 0xD9

Ma comunque fai attenzione al fatto che tu quando scrivi lo sketch il file questo è Unicode, e potrebbe "interpretare" male il compilatore e/o la libreria. Quindi se il tuo display usa US-ASCII prova a stampare usando i valori dei codici per questi caratteri e vedi se funziona, esempio:

tft.print(char(0xC0)); // Stampa la "À"?

Hai ragione, le A partono da 192 a 197
Uso il display a pixel e a mappa l'ha creata TheDotFactory.

||{14, 26, 5772}, ||/* À */ |
||{14, 26, 5824}, ||/* Á */ |
||{14, 26, 5876}, ||/* Â */ |
||{14, 26, 5928}, ||/* Ã */ |
||{14, 26, 5980}, ||/* Ä */ |
||{14, 26, 6032}, ||/* Å */ |

Quindi, o dico al preprocessore di usare 1252 codepage al posto di UNICODE.
Oppure ad ogni lettera accentata metto il valore tft.print("\xC0")
Oppure mi studio come ha fatto adafruit quì

Se ha il codepage 1252 (aka windows-1252, aka ISO 8859-1) si, dovrebbe bastare dirgli di usare quello. Ma mi resta ancora il dubbio che nel sorgente dello sketch ci finisca l'UNICODE. Prova e vedi.

come gli dico di forzare 1252 ?
Di default compila in unicode i caratteri oltre il 128

Ci va una predirettiva.
Quale e come glie la passo ?
C'è un #pragma ? o #define ?
Oppure come la aggiungo alla riga di compilazione ?

Quindi come ?

Un attimo, chiarisco: la mia premessa "Se ha il codepage 1252" intendevo "il display", scusa se ho scritto male.

Per farti capire meglio cosa intendo, per prima cosa vedi cosa ti stampa se fai:

void setup()
{
  Serial.begin(9600);
  char msg[] = "!ÀÈÌÒÙ!";
  
  Serial.print("START ");
  Serial.print("(");Serial.print(strlen(msg)); Serial.println(" characters):");
  int i=0;
  while (msg[i] != '\0') {
    Serial.print(i); Serial.print(") \""); 
    Serial.print(msg[i] & 0xFF, HEX); Serial.println("\"");
    ++i;
  }
  Serial.println("END");
}
 
void loop()
{

}

A me scrive:

START (12 characters):
0) "21"
1) "C3"
2) "80"
3) "C3"
4) "88"
5) "C3"
6) "8C"
7) "C3"
8) "92"
9) "C3"
10) "99"
11) "21"
END

Come vedi quella stringa, che dovrebbe contenere solo 7 caratteri, in realtà ne ha 12!
Quindi devi evitare di usare le accentate maiuscole come carattere ed usare i relativi codici esadecimali. Ad esempio se imposti la stringa così:

  char msg[] = "!\xC0\xC8\xCC\xD2\xD9!";

l'ouput stavolta sarà:

START (7 characters):
0) "21"
1) "C0"
2) "C8"
3) "CC"
4) "D2"
5) "D9"
6) "21"
END

A quel punto la "palla" passa al display, ossia "se ha il set di caratteri US-ASCII" dovrebbe stamparti correttamente le accentate.

Uso il display solo a punti, non uso i font interni.
E si, il compilatore mi mette due caratteri ogni carattere speciale, e se al posto metto il codice numerico lo stampa correttamente.

Però c'è un qualche modo per dire al compilatore di usare la codifica che decido io?

Una direttiva al preprocessore.

Ok, perdonami ma non ho capito bene: visto che probabilmente (spero) usa la solita e diffusissima codifica US-ASCII, se con il mio ultimo esempio (quello con "\xC0\xC8...") stampa qualcosa e lo fa correttamente, intanto dovresti almeno aver risolto.

Non sono certo che esista, ma non credo che sia un problema di direttiva al preprocessore perché se l'editor inserisce nello sketch i caratteri speciali come Unicode (o ISO 8859-1) è un discorso di codifica del file (che sarà quindi UTF-8), e se metti nel codice un carattere esteso finisce per diventare due caratteri ed il compilatore compila quelli come sequenza di char/byte. E se il display non interpreta gli UNICODE, c'è ben poco da fare temo.

Risolto ma non comodo.

Quindi dici che basta convertire il file di testo dei sorgenti con un editor non IDE arduino ?
Notepad++ che ha queste opzioni.
Ma non so corrisponderle.

image

No, o almeno non penso. Perché dipende da quale formato accetta il compilatore gcc (almeno su Windows), quindi non so dirti, mi spiace.