C++: Sonderzeichen lösen Problem aus?
Hallo Leute,
ich habe ein Problem mit Sonderzeichen.
Sonderzeichen wären:
╠
und Zeichen mit Akzent, z.B. ê.
Hier mein Code:
for (auto & p : fs::directory_iterator(VARIABLE)) {
fs::path pn = p.path();
if (is_regular_file(pn)) {
std::string ps = pn.string();
do_something(ps)
}
else {
give_me_some_error();
}
Führe ich den Code eingebaut und mit entsprechenden Parametern aus, funktioniert dieser sehr gut und gibt mir auch die richtigen Ergebnisse zurück.
Problem ist, wenn ein oder mehrere (auch andere) Sonderzeichen, wie oben genannt, kommen. Dann wirft er mir bei
std::string ps = pn.string();
einen Fehler (siehe Bild) aus.
Unter Details anzeigen kommt dann:
Unbehandelte Ausnahme bei 0x755135D2 in Test1.exe: Microsoft C++-Ausnahme: std::system_error bei Speicherort 0x0090EF3C.
-
und wenn ich auf Ausnahmeeinstellungen gehe, kommt, dass er von Kernelbase.dll ausgelöst wurde.
Nach langem Suchen via Google habe ich zum einen herausgefunden, ich solle doch statt path() die u8path() nehmen. Das wirft mir jedoch einen Fehler aus (außer ich habe es falsch gemacht, ich bin neu in C++).
Und ich soll in den Einstellungen das Charset auf Unicode umstellen.
Das hat aber alles nichts gebracht.
Infos:
- Ich nutze die neueste Version von Visual Studio 2019 (heute; 16.12 aktualisiert).
- Ich habe schon gegoogelt, das hat jedoch nichts gebracht.
- Die oben gezeigte for-Schleife ist in einer Funktion drinnen, wo die benötigten Parameter übergeben werden.
- Das Programm funktioniert, solange kein Sonderzeichen kommt.
Ich hoffe, jemand von euch kann mir helfen. Ich bin echt am Verzweifeln.
Weitere Anmerkungen:
Ich habe gerade gesehen, dass mir, wenn ich über den String gehe, zusätzlich noch ausgegeben wird: "Fehler beim Lesen der Zeichenfolge". Ich weiß nicht ob das weiterhilft.
1 Antwort
std::string dürfte immer noch auf 1-Byte-Zeichen basieren (das umzubauen würde kubikmeterweise alten Code unbrauchbar machen). Zeichen, die nicht in einen erweiterten ASCII-Satz passen, sind damit nicht darstellbar. (Außerdem hat man dann immer das Problem, wissen zu müssen, welche "Codeseite" beim encodieren verwendet wurde.)
Für Zeichen, die jenseits von ASCII #127 liegen, gibt es Unicode; und für verschiedene Codierungen von Unicode (UTF-8, UTF-16 etc.) verschiedene C++-Alternativen zu std::string.
Siehe
https://en.cppreference.com/w/cpp/filesystem/path/string
https://www.geeksforgeeks.org/char-vs-stdstring-vs-char-c/
https://www.c-plusplus.net/forum/topic/215536/von-char-1-byte-zu-utf8-2-byte/3
(beim letzten Link scheint jemand ein Problem zu haben, das deinem sehr ähnlich ist)