From ff77dd120706a614b350fbafe8f3f46bbf4bc25e Mon Sep 17 00:00:00 2001 From: Marcel Walter Date: Fri, 20 Feb 2026 12:30:10 +0100 Subject: [PATCH] handle UTF8 characters --- src/main.cpp | 103 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 100 insertions(+), 3 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 503b83d..eb87e78 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -430,12 +430,23 @@ String printClose(String Args) return Text; } +String replaceUTF8Char(const char * message, int &i, unsigned int length); + String printText(String Args) { + + auto message = Args.c_str(); + auto len = Args.length(); + + Text = ""; + for (int i = 0; i < len; i++) + { + Text += replaceUTF8Char(message, i, len); + } + Serial.print("Display would show '"); - Serial.print(Args); + Serial.print(Text); Serial.println("'"); - Text = Args; publishClose(); return Text; @@ -457,6 +468,92 @@ String printLate30(String Args) return Text; } +String replaceUTF8Char(const char * message, int &i, unsigned int length) +{ + String str = "_"; + + if ((message[i] < 0x7E)) + { + //ASCII Char + str = message[i]; + } + else if (((i + 1) < length) && (message[i] == 0xC3) && (message[i + 1] == 0xA4)) + { + str = "ae"; + i += 1; + } + else if (((i + 1) < length) && (message[i] == 0xC3) && (message[i + 1] == 0x84)) + { + str = "Ae"; + i += 1; + } + else if (((i + 1) < length) && (message[i] == 0xC3) && (message[i + 1] == 0xB6)) + { + str = "oe"; + i += 1; + } + else if (((i + 1) < length) && (message[i] == 0xC3) && (message[i + 1] == 0x96)) + { + str = "Oe"; + i += 1; + } + else if (((i + 1) < length) && (message[i] == 0xC3) && (message[i + 1] == 0xBC)) + { + str = "ue"; + i += 1; + } + else if (((i + 1) < length) && (message[i] == 0xC3) && (message[i + 1] == 0x9C)) + { + str = "Ue"; + i += 1; + } + else if (((i + 1) < length) && (message[i] == 0xC3) && (message[i + 1] == 0x9F)) + { + str = "ss"; + i += 1; + } + else if (((i + 1) < length) && (message[i] == 0xC2) && (message[i + 1] == 0xB2)) + { + str = "2"; + i += 1; + } + else if (((i + 1) < length) && (message[i] == 0xC2) && (message[i + 1] == 0xB3)) + { + str = "3"; + i += 1; + } + else if (((i + 1) < length) && (message[i] == 0xC2) && (message[i + 1] == 0xB4)) + { + str = "'"; + i += 1; + } + else if (((i + 1) < length) && (message[i] == 0xC2) && (message[i + 1] == 0xB5)) + { + str = "u"; + i += 1; + } + else if (((i + 2) < length) && (message[i] == 0xE2) && (message[i + 1] == 0x82) && (message[i + 2] == 0xAC)) + { + str = "EUR"; + i += 2; + } + else if (message[i] & 0xC0) + { + //if utf8 char was not handled above find end of utf8 char + while (i < length) + { + i++; + if (!(message[i] & 0x80) || ((message[i] & 0xC0) == 0xC0)) + { + i--; + break; + } + } + } + + return str; +} + void mqttCallback(char *topic, unsigned char *message, unsigned int length) { String MessageString; @@ -464,7 +561,7 @@ void mqttCallback(char *topic, unsigned char *message, unsigned int length) /* Convert all char* to Strings for simpler handling */ for (int i = 0; i < length; i++) { - MessageString += (char) message[i]; + MessageString += replaceUTF8Char((const char*) message, i, length); } String ToppicString(topic);