Frage zu CharArray strlen() und Umlaut

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;
}