Ja, total gerne, zumal ich ja bisher nur experimentiere.
Repo ist schwierig. Ich komme von einem ESP32 +VS1053 und baue meine Software / Hardware gerade komplett um. Da ich Euer Webinterface klasse finde, habe ich angefangen das bei mir zu implementieren. Die Codebasis ist aktuell nicht wirklich kompatibel. Die HTML-Files liegen bei mir z.B. auf der SD.
Ich müsste einen neuen Fork vom ESPuino erstellen und die Änderungen dort noch einmal vornehmen - das wird grundsätzlich wohl das beste sein, muss ich aber dann erstmal vorbereiten.
Bis dahin würde ich vorschlagen, meine Änderungen hier zu posten? Dann können wir darauf rumdenken.
HTML / JS
Alle „charset“ auf utf-8 geändert
Arduino-Code
Ich habe mir zwei Helper-Funktionen gebaut. Zum Testen konvertiere ich einfach erstmal nur die Umlaute.
void Utf8UmlautsToAscii(String utf8String, char *asciiString) {
int k=0;
bool f_C3_seen = false;
for (int i=0; i<utf8String.length(); i++)
{
if(utf8String[i] == 195){ // C3
f_C3_seen = true;
continue;
} else {
if (f_C3_seen == true) {
f_C3_seen = false;
switch (utf8String[i]) {
case 0x84: asciiString[k++]=0x8e; break; // Ä
case 0xa4: asciiString[k++]=0x84; break; // ä
case 0x9c: asciiString[k++]=0x9a; break; // Ü
case 0xbc: asciiString[k++]=0x81; break; // ü
case 0x96: asciiString[k++]=0x99; break; // Ö
case 0xb6: asciiString[k++]=0x94; break; // ö
case 0x9f: asciiString[k++]=0xe1; break; // ß
default: asciiString[k++]=0xdb; // Unknow...
}
} else {
asciiString[k++]=utf8String[i];
}
}
}
asciiString[k]=0;
}
// Conversion routine
void AsciiUmlautsToUtf8(String asciiString, char *utf8String) {
int k=0;
bool f_C3_seen = false;
for (int i=0; i<asciiString.length(); i++)
{
switch (asciiString[i]) {
case 0x8e: utf8String[k++]=0xc3; utf8String[k++]=0x84; break; // Ä
case 0x84: utf8String[k++]=0xc3; utf8String[k++]=0xa4; break; // ä
case 0x9a: utf8String[k++]=0xc3; utf8String[k++]=0x9c; break; // Ü
case 0x81: utf8String[k++]=0xc3; utf8String[k++]=0xbc; break; // ü
case 0x99: utf8String[k++]=0xc3; utf8String[k++]=0x96; break; // Ö
case 0x94: utf8String[k++]=0xc3; utf8String[k++]=0xb6; break; // ö
case 0xe1: utf8String[k++]=0xc3; utf8String[k++]=0x9f; break; // ß
default: utf8String[k++]=asciiString[i];
}
}
utf8String[k]=0;
}
In Deiner Funktion explorerHandleListRequest
sieht die while-Schleife jetzt so aus. Ich verwende zum Testen einfach asciiFilePath
doppelt.
while(file) {
JsonObject entry = obj.createNestedObject();
AsciiUmlautsToUtf8(file.name(), asciiFilePath);
std::string path = asciiFilePath; //file.name();
std::string fileName = path.substr(path.find_last_of("/") + 1);
entry["name"] = fileName;
entry["dir"].set(file.isDirectory());
file = root.openNextFile();
//esp_task_wdt_reset();
}
serializeJson(obj, serializedJsonString);
request->send(200, "application/json; charset=utf-8", serializedJsonString);
Damit werden Files, die ich unter Windows kopiert habe korrekt angezeigt.
Für die andere Richtung habe ich Deine Funktion explorerHandleCreateRequest
angepasst.
void(AsyncWebServerRequest * request) {
AsyncWebParameter * param;
char asciiFilePath[256];
if (request -> hasParam("path")) {
param = request -> getParam("path");
Utf8UmlautsToAscii(param -> value(), asciiFilePath);
Serial.print("Incomming: ");
Serial.println(param -> value());
Serial.print("2ASCII: ");
Serial.println(asciiFilePath);
if (FSystem.mkdir(asciiFilePath)) {
//snprintf(logBuf, serialLoglength, "CREATE: %s created", asciiFilePath);
//loggerNl(serialDebug, logBuf, LOGLEVEL_INFO);
} else {
//snprintf(logBuf, serialLoglength, "CREATE: Cannot create %s", asciiFilePath);
//loggerNl(serialDebug, logBuf, LOGLEVEL_ERROR);
}
} else {
//loggerNl(serialDebug, "CREATE: No path variable set", LOGLEVEL_ERROR);
}
request -> send(200);
}
Das ist mein aktueller Stand.
Über Filebrowser einen Ordner anlegen mit Sonderzeichen → Windows zeigt ihn korrekt an
Unter Windows einen Ordner/File anlegen → FileBrowser zeigt ihn korrekt an.