Komplexen String in Variable abspeichern (Bsp. HTML Code in Variable abspeichern

Hallo Zusammen,
ich suche nach einer Möglichkeit komplexe Zeichenketten wie z.B. einen kompletten HTML Code in einer Variablen abzuspeichern. Dabei möchte ich die Zeichenkette nach Möglichkeit NICHT editieren, sondern lediglich per Copy und Paste in meiner Variable einsetzen.

Das Problem dabei sind verschiedene enthaltene Zeichen wie z.B. die Anführungszeichen ("). Diese lassen sich zwar in einem String einfügen, soweit ein Backslash vorangestellt wird, welches aber eine STARKE Modifikation der Zeichenkette erfordert. Bei einem längeren HTML Code kaum zumutbar. Zwar kann man hier auch hin und wieder das einfache Anführungszeichen (’) verwenden, grundsätzlich komme ich aber hiermit nicht weiter.

Ebenfalls muss nach, bzw. vor jedem Umbruch ein weiterer Backslash eingefügt werden, damit die Zeichenkette formatiert bleiben kann (vgl. HTML mit mehreren Umbrüchen zur Strukturierung des Codes).

Ist es nun möglich eine komplexe Zeichenkette in irgendeiner Form UNVERÄNDERT in die Arduino IDE einzufügen und als Variable (String) zu verarbeiten?

Am liebsten wäre mir eine .h Datei in welcher ich die Zeichenkette einfügen kann und auf diese referenziere.

String LOAD_UI_HEADER = {"\
\
<html>\
<head>\
<title>Arduino Forum</title>\
</head>\ 
<body>\
<p>Willkommen</p>\
</body>\  
</html>\
\
"};

Dafür wurden in C++11 "raw string literals" eingeführt

char str[] = R"(Zeile1
Zeile2
Zeile3
"Anfuehrungszeichen"
)";

void setup() 
{
  Serial.begin(9600);
  Serial.println(str);
}

void loop()
{
}

Ausgabe:

Zeile1
Zeile2
Zeile3
"Anfuehrungszeichen"

Stark!! Das ist ja klasse :slight_smile: Danke für die schnelle Antwort!

Ist es möglich in diesen String noch weitere Elemente einzubauen?

Siehe Beispiel:

String TEST = "2 EINGEFÜGT";

char str[] = R"(
Zeile: 1
Zeile: <HIER SOLL DER STRING "TEST" EINGEFÜGT WERDEN>
Zeile: 3
)";

void setup() 
{
  Serial.begin(9600);
  Serial.println(str);
}

void loop()
{
}

Ausgabe:

Zeile: 1
Zeile: 2 EINGEFÜGT
Zeile: 3

Das ist für String Literale. Da dynamisch Strings zusammenzustrückeln geht natürlich nicht. Dafür bräuchtest du zwei Strings. Einen vor und einem nach der Einfügestelle

Und wie so oft: die String Klasse ist hier i.d.R. überflüssig

Habe es geschafft!

String LOAD_UI = R"=====(

HIER STEHT DER STRING UND DYNAMISCH |PLATZHALTER| AUCH!! :)

)=====";

LOAD_UI.replace("| PLATZHALTER |","HIER");

Ausgabe:

HIER STEHT DER STRING UND DYNAMISCH HIER AUCH!! :)

Dieser Forumsbeitrag war auch sehr hilfreich: Link

Ich hoffe du hast noch viel RAM für solche Spielereien frei :slight_smile:

EDIT:
wobei replace() gar nicht sooo ineffizient ist wie es den Anschein hat. Da wird mit rellaoc() und memmove() gearbeitet. Also einfach der Speicher erweitert und verschoben. Aber du hast trotzdem einen nicht unerheblichen Overhead und der Speicher ist bei den Ethernet Sachen auf dem UNO meistens etwas knapp.

Das größte Problem ist aber einfach dass man den Text nicht per PROGMEM im Flash lassen kann, so dass gar kein RAM belegt wird.

Tu dir einen Gefallen und verzichte völlig auf Strings (auf 8 Bit Arduinos).

Habe 4MB zur Verfügung :slight_smile: Nutze einen ESP8266 12 und brauche den String auch nicht im Flash abspeichern. Baue mir den String zur Laufzeit im Setup zusammen

Du hattest keine Plattform genannt, mit den Limitationen des ESP12 kenne ich mich noch nicht aus.
Die 4 MB sind aber Flash, nicht RAM.

Hi,
ich möchte gerne wissen, was es mit den Gleichheitszeichen vor und nach den Klammern auf sich hat:

R"=====()=====";

Weiß da jemand drüber Bescheid?

Lies mal was zu RAW-String-Literal. Das sind die Begrenzer.

Gruß Tommy

guckst du “c++11 raw string literal”

R"(im einfachsten Fall)";

Wenn aber die Zeichenfolge )" nicht das Ende sein soll, weil es im Text selbst vorkommt, kannst du Anfang und Ende durch andere Zeichen zwischen " und ( eindeutig machen.

R"!(z.B. "hallo (geht so auch)"  )!";  

"z.B. \"hallo (geht so auch)\"  ";

(so machen es Leute, die auch mit älteren Compilern zufrieden sind)