Forum: PC-Programmierung C++, Windows, Streams und I18n :(


von Zombie (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

ich muss zugeben, I18n ist für mich immer noch ein Buch mit sieben 
Siegeln. Ich bin immer froh, wenn es funktioniert, und aufgeschmissen 
wenn es nicht funktioniert. So wie im Moment...

Ich habe einen Ordner mit asiatischen Zeichen (siehe im ZIP im Anhang), 
der eingelesen und mittels c++ streams sowohl auf der Konsole (als auch 
in eine Textdatei -> selbes Problem) geschrieben werden soll.

Das Problem ist, dass nur genau bis zu dem ersten exotischen geschrieben 
wird, danach ist die Konsole stumm (das selbe bei der Textdatei).

Folgender Code:
1
#include <iostream>
2
#include <filesystem>
3
4
namespace fs = std::filesystem;
5
6
int main() {
7
    fs::directory_iterator it("c:\\Temp\\Unicode-Test");
8
    std::wcout << *it << "\n";
9
    std::wcout << it->path().wstring() << "\n";
10
    std::wcout << "Hello World!\n";
11
}

Gibt folgendes aus:
1
c:\Temp\Unicode-Test\
ENDE!
"Hello World" erscheint auch nicht mehr. Das Programm arbeitet 
allerdings ordendlich bis zum Ende. Im Debugger kann ich auch erkennen, 
dass der komplette Verzeichnisname inkl. asiatischen Zeichen in dem 
Objekt "it" enthalten sind. Bei der Ausgabe geht dann allerdings 
irgendwas schief.

Irgendjemand eine Idee?

Danke!

von IT-Abteilung (Gast)


Lesenswert?

cmd oder Powershell?

von Zombie (Gast)


Lesenswert?

IT-Abteilung schrieb:
> cmd oder Powershell?

Hmmm... gute Frage. Im Moment starte ich das Programm direkt über Visual 
Studio. Keine Ahnung in welchem Kontext es da ausgeführt wird.
Aber eigentlich suche ich eine Lösung die "immer" funktioniert.

Für die Ausgabe in eine Textdatei habe ich nach diesem Beispielcode 
(https://www.cplusplus.com/reference/locale/wbuffer_convert/) eine 
Lösung gefunden.
1
#include <iostream>
2
#include <filesystem>
3
4
#include <fstream>
5
#include <codecvt>
6
7
namespace fs = std::filesystem;
8
9
class Utf8FileStream : public std::wostream, public std::wistream {
10
public:
11
    Utf8FileStream(const char *filename_, std::ios_base::openmode openmode_ = std::ios_base::out) : file_buffer(), converter_buffer(&this->file_buffer), std::wostream(&this->converter_buffer), std::wistream(&this->converter_buffer) {
12
        this->file_buffer.open(filename_, openmode_);
13
    }
14
15
private:
16
    std::filebuf file_buffer;
17
    std::wbuffer_convert<std::codecvt_utf8<wchar_t>> converter_buffer;
18
};
19
20
int main() {
21
    fs::directory_iterator it("c:\\Temp\\Unicode-Test");
22
23
    Utf8FileStream fstream("test.txt");
24
    fstream << *it << "\n";
25
    fstream << it->path().wstring() << "\n";
26
    fstream << "Hello World!\n";
27
}
Allerdings ist std::wbuffer_convert seit C++17 deprecated, und ich musst 
den Compiler mithilfe von 
_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING inständig bitten, mir 
diesen Code gnädigerweise zu übersetzen. Das ist also auch keine 
wirkliche Lösung...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.