auch wenns scheinbar niemanden interessiert, hier nun die Bestätigung.
Es läuft auf Displays mit dem A00 Zeichensatz. Das sind jene, die im oberen Bereich japanische Zeichen ausgeben. Es gibt nur kleine Umlaute im ROM, große Umlaute werden somit auch durch kleine ersetzt.
Dann noch ein paar Sonderzeichen wie Micro, Grad, Division und Summe.
Ich lade mal die unaufbereitete Version hier hoch, evtl. baue ich es in einer anderen Lib ein. Weis aber noch nicht in welche.

So schaut das write nun aus:
inline size_t LiquidCrystal_I2C::write(uint8_t value) {
//Serial.println(value, HEX);
if (special == 0xC3)
{
special = 0;
switch (value)
{
case 0x84 : // Ä
case 0xA4 :
send(0xE1, Rs); // gibt ein ä aus
break;
case 0x96 : // Ö
case 0xB6 :
send(0xEF, Rs); // gibt ein ö aus
break;
case 0x9C : // Ü
case 0xBC :
send(0xF5, Rs); // gibt ein ü aus
break;
case 0x9F :
send(0xE2, Rs); // gibt ein ß aus
break;
case 0xB7 :
send(0xFD, Rs); // DIVISION SIGN
break;
default :
//Serial.print("D40 default 0x"); Serial.println(value, HEX);
write(value);
}
}
else if (special == 0xC2)
{
//Serial.print("D37 "); Serial.println(value, HEX);
special = 0;
switch (value)
{
case 0xB0 :
write(0xDF); // DEGREE SIGN
break;
case 0xB5 :
write(0xE4); //MICRO SIGN
break;
case 0xB7 :
write(0xEF); // MIDDLE DOT
break;
default :
//Serial.print("default 0x"); Serial.println(value, HEX);
send(value, Rs);
}
}
else if (special == 0xE2)
{
//Serial.print("D64 "); Serial.println(value, HEX);
special = 0;
switch (value)
{
case 0x88 :
send(0xF6, Rs); // SUMMATION
break;
default :
//Serial.print("default 0x"); Serial.println(value, HEX);
send(value, Rs);
}
}
else if (value == 0xC2 || value == 0xC3 || value == 0xE2)
{
special = value;
}
else
{
send(value, Rs); // "normales" Zeichen
}
return 1;
}
sind noch eine Menge auskommentierte Debug-Ausgaben drinnen, aber läuft bisher fehlerfrei.
Wenn ich das jetzt alles richtig im Kopf habe, zum Nachlesen:
Sonderzeichen kommen als UTF-8, daher kommt bei einigen Sonderzeichen vorher ein Kontroll-Byte (C2, C3, ...). Ich frage daher im .write auf diese Sonderzeichen ab, setze entsprechend ein Flag (special) um dann im nächsten .write zu wissen, das ein Sonderzeichen vorausgegangen ist. Über die Switch/Case wird dann das UTF Zeichen auf den LCD-Zeichensatz umgeschlüsselt. Nerven kostet die Überschneidung vom ß und dem Summenzeichen, aber es klappt auch.
Wie erwähnt, ich habe hier nur ein Display mit dem A00 Zeichensatz. Im A01 Zeichensatz gibt es mehr europäische Sonderzeichen (und auch kyrillische Zeichen). Wenn man ein Display mit A01 Zeichensatz hat, muss man halt die auszugebenden Zeichen anpassen. Z.B. wäre das ä dann 0xE4.
Vorgangsweise sollte nun klar sein.
Edit: Anlage gelöscht.
Download der Lib von meiner Homepage (da wird es auch gewartet).