für den Herrn Inspektor an der Tür eine Variante:
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println(F("Start..."));
const char tak[] = "zurück";
Serial.println(strlen(tak));
for (uint8_t i = 0; i < strlen(tak); i++)
{
Serial.print(i);
Serial.print(" ");
Serial.print(tak[i]);
Serial.print(" ");
Serial.println(tak[i], HEX);
}
Serial.println("aber...");
Serial.println(utf8_strlen(tak));
Serial.println(utf8_strlen4dummies(tak));
}
void loop()
{}
int utf8_strlen(const char * str) // http://www.zedwood.com/article/cpp-utf8-strlen-function
{
int c, i, ix, q;
for (q = 0, i = 0, ix = strlen(str); i < ix; i++, q++)
{
c = (unsigned char) str[i];
if (c >= 0 && c <= 127) i += 0;
else if ((c & 0xE0) == 0xC0) i += 1;
else if ((c & 0xF0) == 0xE0) i += 2;
else if ((c & 0xF8) == 0xF0) i += 3;
//else if (($c & 0xFC) == 0xF8) i+=4; // 111110bb //byte 5, unnecessary in 4 byte UTF-8
//else if (($c & 0xFE) == 0xFC) i+=5; // 1111110b //byte 6, unnecessary in 4 byte UTF-8
else return 0;//invalid utf8
}
return q;
}
int utf8_strlen4dummies(const char * str)
{
byte c = 0;
byte r = 0; // result
for (size_t i = 0; i < strlen(str); i++)
{
c = (unsigned char) str[i];
if (c <= 127) r++;
else if ((c & 0xE0) == 0xC0)
{
i += 1;
r++;
}
else if ((c & 0xF0) == 0xE0)
{
i += 2;
r++;
}
else if ((c & 0xF8) == 0xF0)
{
i += 3;
r++;
}
}
return r;
}