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.
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 ....
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() {
}
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.
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
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 ....
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
@olikraus: Im Beispiel nutzt Du den Font u8g2_font_helvR14_tf, das müßte aber ein extended sein, also u8g2_font_helvR14_te, oder?
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.
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.