RFID Card Reader mit Sonderzeichen

Hallo zusammen,
ich habe die letzten Tage an einem RFID Card-Reader gesessen.
Schreiben geht, lesen geht, alles OK.
Auf der Karte werden die Besitzerdaten gespeichert.
Vorname, Nachname, Geburtstag, Karte gültig bis.
Jetzt kommt es aber in Deutschland öfter vor, dass jemand Müller heißt.
Schreiben geht, kein Gemecker bei Sonderzeichen.
Beim Auslesen werden dann halt nicht HTML-Konforme Zeichen erzeugt.
Gelesen und geschrieben wird über eine Webseite via ajax.
Nach einer langen Nachtschicht mit 4 Kannen Kaffee habe ich dann diesen Code für die Umwandlung der Sonderzeichen geschrieben:

String dumpByteArray(byte buff[], byte len, bool replaceChars) {
  char byteArray[len];
  memset(byteArray, 0, sizeof(byteArray));
  char build[6];
  for (uint8_t i = 0; i < len-2; i++) {
    if (buff[i] == 32 || buff[i] == 10 || buff[i] == 13) {
      continue;
    }
    if (replaceChars) {
      switch (buff[i]) {    
        case 196: sprintf(build, "%s", "Ä"); break;
        case 214: sprintf(build, "%s", "Ö"); break;
        case 220: sprintf(build, "%s", "Ü"); break;
        case 223: sprintf(build, "%s", "ß"); break;
        case 228: sprintf(build, "%s", "ä"); break;
        case 233: sprintf(build, "%s", "é"); break;
        case 246: sprintf(build, "%s", "ö"); break;
        case 252: sprintf(build, "%s", "ü"); break;
        default: sprintf(build, "%c", buff[i]); break;
      }
    }
    else{
      sprintf(build, "%c", buff[i]);
    }
    strcat(byteArray, build);
    memset(build, 0, sizeof(build));
  }
  char result[sizeof(byteArray+2)];
  sprintf(result, "%s", byteArray);
  return String(result);
}

funktioniert wunderbar.
Jetzt eine Frage an die hier anwesenden C++ Experten:
Ist das C++ komform oder eher Basic?
Geht da noch eine Optimierung in Bezug auf Geschwindigkeit oder Speicherverbrauch?
Ich bin schon zufrieden, dass es überhaupt funktioniert aber irgendwie sieht das nicht so richtig C++ aus.

Gruß von einem inzwischen grauhaarigen Programmierer

Einen kompilierbaren Sketch, der ohne Hardware auskommt ???
Könnte ich nur zippen und irgendwo zum Download bereitstellen(habe ich getan siehe Link unten).
Als Hardware wären hier jetzt "nur" ein ESP8266 und ein RFID RC522 nötig.
Dann wäre noch das Problem mit den im Sketch verwendeten Libs. Jeder hat irgendwo seine eigenen Bibliotheken eingebunden.
Der Quellcode sieht noch ziemlich vermüllt aus.
Uuuund dazu noch jede Menge Strings.
Funktionen die ERROR oder SUCCESS als Rückgabewert liefern, sind mit Sicherheit sinnvoller.
Aber ich schreibe ja noch daran.
Momentan habe ich 45% Speicherverbrauch für globale Variablen und 38% Speicherverbrauch für das Programm.
Die ganze Gaudi läuft auch über mehrere Tage stabil.
Ich will halt mehr C++ konformer programmieren, weil wir da eben Pointer verwenden werden können und nicht immer erst alle Daten aus dem Speicher lesen, einer Funktion übergeben und dann wieder schreiben.
Wer Bock auf einen Test und eine gemeinsame Weiterentwicklung hat, bekommt von mir die Hardware zugeschickt.
Hier der Link zum Projekt:http://arduino.joomandeo.de/ESPimatic32-PCF_SQL_TS_RFID.rar

Happy coding

Das ist ja das Problem mit den Sonderzeichen.
Original buff durch 'ü' ersetzen geht halt nicht, weil 'ü' länger ist als das original byte. Also musste ich die Zeichen immer wieder an das neue Array hinten dran hängen, statt im gelesenen Array zu ersetzen.
Warum auch immer. Kein strcat, strcpy, memcpy hat funktioniert.
Immer kam es zu einem Chrash. Die jetzige Form funktioniert und gibt alle Werte sauber zurück.
Aber so wie das aussieht, ist das doch eher Kinder scripting und kein C++.

Diese Beobachtung von dir kann ich nicht glauben bzw. glaube ich nicht, das deine Erkenntnis richtig ist.
In ASCII ist 'Ü' = Dez 154. Da sind wir uns sicher einig, dass das ein Byte ist.
Wo im Code wird die Karte beschrieben? Woher kommen die Daten zum schreiben?

In der MFRC522 Lib sind einige Samples, mit denen man die Karten schreiben und lesen kann.
Die Daten werden im Serial Monitor der Arduino IDE oben eingegeben.
Wenn man dann Die Karte ausliest, steht an der Stelle "ü" ein FC und das ist Dez 252.

In ASCII ist 'ü' = Dez 154.

In ASCII sind nur die Zeichen bis 127 definiert, und da ist kein 'ü' dabei.

Beim UTF-8 Zeichensatz braucht man sogar 2 Byte, um ein nicht-ascii Zeichen darzustellen.

Was bei Serial.print("ü"); passiert, kann schon mal seltsam werden, wenn das Terminal eine wesentlich andere Maschine ist als die des Compilers.
lcd.print ("ü"); geht üblicherweise nicht.

Ich will ja nix auf einem LCD ausgeben.
Die Daten der Karte werden per ajax vom Browser abgeholt und ohne Umwandlung der Sonderzeichen steht da halt statt einem "ü" so ein schwarzes Karo mit einem Fragezeichen in der Mitte.
Nach meiner experimentellen Umwandlung wird da jetzt ein ü angezeigt.
Die Frage war halt, ob meine Funktion Schrott ist, oder so geht (was C++ betrifft).
Bisher (25 Jahre) habe ich mit MS Visual Studio C++ geschrieben. Wenn man da mit den MFC Klassen arbeitet, kümmert sich CString um alle diese Probleme.
Arduino C gemischt mit C++ ist da wieder eine völlig neue Herausforderung.
Eine ganze Nacht try and error, nur um Sonderzeichen korrekt darzustellen, war schon heftig.

die wunderbare Welt der Codepages ... wie einfach wäre die Welt wenn wir nur 7 bit hätten :wink:

OT: ich hab mich auch vertan, bei mir liegt da seit 30 Jahren ein Schummler auf dem Schreibtisch aus dem "Das große Norten-Utilities Buch" und ich werde jetzt ASCII fett durchstreichen und Codepage 437 drüber schreiben ... mea culpa

Oh ja, was passiert noch alles wegen der Globalisierung.
Plötzlich heißt ein Benutzer José. Da geht wieder alles von vorne los.
Jede Eventualität zu berücksichtigen, sprengt den knapp bemessenen Speicherplatz auf jedem µC.
Auf dem ESP8266 geht es eigentlich. Ich habe jetzt trotz 4000 Zeilen Code noch über 50% im Speicher frei.
Jede irgendwie vermeidbare Form von String habe ich entfernt. Und siehe da: Noch mal 2Kb mehr Speicher frei.