U8g2 for Adafruit und Umlaute

Hallo,

ich komme einfach mit der Ausgabe von "höherwertigen" Zeichen nicht klar, wie und wo muss ich denn das -> " The print() command supports UTF-8 by default. It also can not be disabled. For U8g2 the UTF-8 support must be enabled first." frei schalten?
Ein print "\x41" bringt wie erwartet ein A, aber alles oberhalb der magischen Grenze funktioniert nicht.

cu

Gut.
Da ist also nix zu tun!

Dann brauchst du noch einen Font der die gewünschten Zeichen auch hat, und dann einfach ausgeben.

Du weißt schon, wie Unicode funktioniert?

Das ist zu ungenau.

Zeige ein kleines, nachvollziehbares Testprogramm, das ich mit meinen, funktionierenden vergleichen kann, und beschreibe, was Du siehst, oder mache ein Foto.

Ist halt ein Problem wenn man es zigmal liest und dennoch den falschen nimmt .... :roll_eyes:
Ich hatte doch tatsächlich den tr statt tf, und der kann das natürlich nicht.

Aber der tf sollte doch alles können .... -> u8g2_font_osb26_tf

Grad kriege ich noch hin, aber alles über xbf kommt nicht.

#include <Streaming.h>   // die Lib findest du selber ;-)
Print &cout = Serial;    // cout Emulation für "Arme"


#define LCD_CS A3     // Chip Select goes to Analog 3
#define LCD_CD A2     // Command/Data goes to Analog 2
#define LCD_WR A1     // LCD Write goes to Analog 1
#define LCD_RD A0     // LCD Read goes to Analog 0
#define LCD_RESET A4  // Can alternately just connect to Arduino's reset pin

//#include <Adafruit_GFX.h>  // Hardware-specific library wird über MCUFRIEND eingebunden

#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

#include "U8g2_for_Adafruit_GFX.h"

U8G2_FOR_ADAFRUIT_GFX u8g2;


//#include "bitmaps_48.h"


void setup() {

  Serial.begin(9600);

  uint16_t identifier = tft.readID();
  tft.begin(identifier);

  tft.setRotation(1);   //Querformat
  tft.fillScreen(TFT_WHITE);

  u8g2.begin(tft);

  u8g2.setFont(u8g2_font_osb26_tf);
  u8g2.setBackgroundColor(TFT_WHITE);
  u8g2.setForegroundColor(TFT_BLACK);

  int x1 = 10;
  int y1 = 50;
   u8g2.setCursor(x1, y1);
  
  u8g2.print("Test ");
  u8g2.print("\xb0");   // Grad ok
  u8g2.print("\xbf");   // auch ok
  u8g2.print("\xc0");   // ab hier nichts mehr
  u8g2.print("\xcf");
  u8g2.print("\xd0");
  u8g2.print("\xdf");
  u8g2.print("\xe0");
  u8g2.print("\xef");
  u8g2.print("\xb0");
  u8g2.print("\xf0");
  u8g2.print("\xfc");   //sollte ein ü sein?
  

}

void loop() {

}

u8g2.print("ü"); //sollte ein ü sein!

Alternativ:
u8g2.print("\xc3\xbc"); //sollte ein ü sein!

Und dann kommen wir auf dieses zurück:

Warum machst Du es nicht so:


  u8g2.print("Test ");
  u8g2.print("Ä");
  u8g2.print("Ö");
  u8g2.print("Ü");
  u8g2.print("ä");
  u8g2.print("ö");
  u8g2.print("ü");
  u8g2.print("ß");
}

?

Nö, der kann alle (f=full) erweiterten ASCII-Zeichen, nicht aber UTF-8. Zusammen mit U8g2_for_Adafruit_GFX.h mußt Du also einen e=extended Font auswählen, siehe setFont.

UNICODE besteht aus vier Bytes je Zeichen, UTF-8 aus einem bis vier Bytes, siehe UTF-8-Codetabelle mit Unicode-Zeichen. Das "ü" benötigt zwei Bytes 0xC3BC.

Alles, was ich sonst noch hätte schreiben wollen, findest Du in #5 und #6.

Ok, die Ausgabe der Zeichen nach 127 hat mit UTF also nichts zu tun ....
Damit habe ich mich noch nicht so beschäftigt, da der normale Zeichensatz immer gereicht und funktioniert hat.
Mit dem tr natürlich nicht ....

Mit dem richtigem Zeichensatz klappt die Ausgabe direkt über das Tastaturzeichen, die UTF-Kodierung des "ü" geht auch. (Anscheinend muss da nichts "enabled" werden.)
Was ich aber nicht verstehe, warum geht die Ausgabe über \x?? nur bis xbf und nicht weiter?
Die Codes werden direkt ignoriert.

cu

was meinst du zum Beispiel welche Werte?
Dass in so einem Byte an den ersten Stellen etwas codiert ist, ist dir bewusst?

wenn du UTF-8 Zeichen nachschlagen willst, ich mag diese Seite:
https://www.utf8-zeichentabelle.de/

Wenn man den Sketch laufen lässt wird das noch ausgegeben:

u8g2.print("Test ");
u8g2.print("\xb0");   // Grad ok
u8g2.print("\xbf");   // auch ok

Der weitere Code wird völlig ignoriert, obwohl das Prinzip der Ausgabe identisch ist, binär ->\x codierte Zeichen wie \xb0 und \xbf.

u8g2.print("Reihe");
u8g2.print("\xc0");   // komplett ignoriert
u8g2.print("\xcf");
u8g2.print("\xd0");
u8g2.print("\xdf");
u8g2.print("\xe0");
u8g2.print("\xef");
u8g2.print("\xb0");
u8g2.print("\xf0");
u8g2.print("\xfc");   
u8g2.println();       // bis hierhin

u8g2.print("UTF ");

Nichts zwischen Reihe und UTF ....
Sollte doch gehen?

cu

das erste zeichen das du nach "Reihe" ausgibst:

0xC0 = 0b11000000

ist also ein Startbyte mit einem Folgebyte.
Das nächste:
0xcf
= 11001111

ist kein gültiges Folgebyte.

llies noch mal den Link den ich gepostet habe.

10000000–10111111 80–BF 128–191 Zweites, drittes oder viertes Byte einer Bytesequenz

Offensichtlich stimmen deine Annahmen/Vorstellungen/Fantasien nicht mit denen Festsetzungen, welche die UTF-8 Entwickler getroffen haben, überein.

Vielleich auch hier mal lesen,

In einer zufällig begonnenen Folge von Bytes kann UTF-8 den Anfang eines Zeichens erkennen. Alle anderen Bytes werden ignoriert. Was Dich verwundert ist tatsächlich eine sehr wichtige Eigenschaft von UTF-8.

Nö, denn Du bist immer noch der Vorstellung verhaftet, ein Byte müßte einem Zeichen entsprechen. Bei ASCII ist das so, bei UTF-8 aber nicht.

Diesen Knoten im Gehirn mußt Du unbedingt gelöst bekommen :slightly_smiling_face:

Mir ist schon klar, dass bei UTF ein Zeichen auch durch mehrere Bytes codiert sein kann.
Die Codes waren ein Versuch, den Zeichensatz über die hexadezimalen Codes anzusprechen. Anscheinend funktioniert das mit u8g2 nicht wie sonst, der interpretiert anscheinend alles als UTF und handelt entsprechend. Also das Zeichen über die Tastatur eingeben oder die UTF-Codes benutzen.
Etwas irritierend, da ich mir nicht bewusst bin, die UTF-Unterstützung aktiviert zu haben ....

cu

Doch, hast Du, denn Du verwendest nicht U8g2, sondern U8g2_for_Adafruit_GFX, wodurch UTF-8 automatisch aktiviert ist. Das hat Oli auch in Differences to U8g2 beschrieben :wink:


@olikraus: Im Beispiel nutzt Du den Font u8g2_font_helvR14_tf, das müßte aber ein extended sein, also u8g2_font_helvR14_te, oder?

noch mal von vorne.

0xC0 0xCF ist kein gültiges Zeichen in UTF-8
Es ist also in Ordnung dass da nichts am Display ankommt.
Welches Zeichen hättest du dir denn erwartet?

Dabei hast du das doch selber zitiert:

Was gibt es daran nicht zu verstehen?
Was ist daran verwirrend?

Aus meiner Sicht:
Du bist für deine Verwirrungen selbst verantwortlich.

Dann war das ein Missverständnis meinerseits, ich habe den zweiten Teil auch auf U8G2 for Adafruit bezogen, obwohl sich dieser Teil wohl auf den "reinen" U8G2 bezieht.

Naja, da ich durch das Missverständnis nicht von UTF-Unterstützung ausgegangen bin die Zeichen, die an diesen Stellen im Zeichensatz liegen. Also was ohne UTF-Unterstützung kommen sollte.
Mit der richtigen Interpretation ist mir schon klar, dass ich den Zeichensatz eben nicht so ansprechen kann.

Da hast Du wohl recht ..... :face_exhaling:

Das passiert, denn an manchen Stellen merkt man die historische Entwicklung, da ist es nicht aus einem Guß. Dennoch ziehe ich ganz viele Hüte vor Menschen wie Oli, die eine Bibliothek auf ein solches Niveau heben.

Gelegentlich schaut Oli hier im Forum vorbei und reagiert auf Hinweise.

Danke an alle ....