Sonderzeichen in Strings



  • @Nokman sagte in Sonderzeichen in Strings:

    Was mir eben bei utf8 aufgefallen war das es so als 2 Zeichen ausgegeben wird und nun wo es richtig ist nur eins.

    Naja, utf-8 ist 1, 2, 3 oder 4 Zeichen lang. Mit einem Byte kannst du nicht alle Unicode-Zeichen darstellen, weil es mehr als 256 gibt.

    Wie ist es denn jetzt "richtig"? Hast du die Ratschläge von utf8everywhere befolgt? Oder einen anderen Weg gewählt?



  • @wob sagte in Sonderzeichen in Strings:

    @Nokman sagte in Sonderzeichen in Strings:

    Was mir eben bei utf8 aufgefallen war das es so als 2 Zeichen ausgegeben wird und nun wo es richtig ist nur eins.

    Naja, utf-8 ist 1, 2, 3 oder 4 Zeichen lang. Mit einem Byte kannst du nicht alle Unicode-Zeichen darstellen, weil es mehr als 256 gibt.

    Wie ist es denn jetzt "richtig"? Hast du die Ratschläge von utf8everywhere befolgt? Oder einen anderen Weg gewählt?

    Richtig bedeutet im Moment nur das ich die Zeichencodierung der Datei geändert habe und somit die Umlaute im richtigen Wert sind um Sie an Dateien zu übergeben. Heute am Abend werde ich mir die Zeit nehmen mit Hilfe der Vorschläge beides hinzubekommen. Umlaute werden Dargestellt in der Konsole und die Datei kann geöffnet werden



  • @Nokman Bist du sicher dass die Datei auch in CP 850 ist? CP 850 ist nämlich eher unüblich für den Inhalt von Dateien. Das wird quasi nur für DOS-Zeugs und die {{cmd.exe}} Konsole von Windows verwendet.



  • @hustbaer sagte in Sonderzeichen in Strings:

    CP 850

    Muss ich kurz Richtig stellen
    CP 850, damit geht es nicht die Umlaute zum Öffnen von Datei zu nutzen, dies ist nur für die Console.
    ISO 8551-1 ist zum Öffnen der Datei

    es sind 2 getrennte Programme welche im Moment genau das machen das Eine zeigt Umlaute in der Console das andere kann Umlaute in Dateinamen verarbeiten.

    Nun Probiere ich die beiden zusammenzubringen das es beides in einen geht. Aber da probiere ich ein wenig das es geht weis ich nun.



  • Zum Öffnen von Dateien solltest du auf Windows grundsätzlich Wide-Character Strings oder std::filesystem::path verwenden. Dann stellt sich die Frage der Codepage nicht. Bzw. nur dort wo zwischen 8-Bit und "wide" konvertiert werden muss. Was man z.B. nicht muss wenn man die Pfade per Command-Line Argument übergeben bekommt oder wenn die Pfade hard-coded sind.



  • @hustbaer sagte in Sonderzeichen in Strings:

    Zum Öffnen von Dateien solltest du auf Windows grundsätzlich Wide-Character Strings oder std::filesystem::path verwenden. Dann stellt sich die Frage der Codepage nicht. Bzw. nur dort wo zwischen 8-Bit und "wide" konvertiert werden muss. Was man z.B. nicht muss wenn man die Pfade per Command-Line Argument übergeben bekommt oder wenn die Pfade hard-coded sind.

    genau an der Stelle hänge ich noch fest std::filesystem::path hate ich noch nicht gesehen aber wie ich es lese funktioniert es mit meinen Momenten Compiler nicht MiniGW,
    Daher bin ich wie auch auf der Seite beschrieben an der wstring als Eingabe ran was mir dabei nur nicht gelingt ist die Konvertierung damit ich es in fstream nutzen kann, da werden keine char_t sondern nur char nutzt.



  • Dafür gibt es dann auch die entsprechenden "wide-string" Klassen: wfstream, wifstream, wofstream, ..



  • @Nokman sagte in Sonderzeichen in Strings:

    wstring als Eingabe ran was mir dabei nur nicht gelingt ist die Konvertierung damit ich es in fstream nutzen kann

    Der fstream Konstruktor der MSVC Standard Library akzeptiert wchar_t* als Pfad. Also falls es darum geht. Wenn das die Standard Library von MinGW nicht kann, dann ist diese unter Windows schlecht brauchbar. Du bist dann auf die 8-Bit CodePage des Systems eingeschränkt.

    Falls es um die Ausgabe in den Stream geht: wenn du dort Wide-Strings brauchst, dann ist das doof. wfstream könntest du dir ansehen, könnte sein dass man damit brauchbar arbeiten kann. Kann ich nix dazu sagen, ausser dass du aufpassen solltest ob dabei dann auch wirklich die garantiert gewünschte CodePage im File landet.

    Was MinGW angeht: kannst du das Tool nicht auf z.B. MSVC portieren? Damit hättest du einen modernen Compiler mit Support für C++17 inklusive std::filesystem.



  • @Th69 sagte in Sonderzeichen in Strings:

    Dafür gibt es dann auch die entsprechenden "wide-string" Klassen: wfstream, wifstream, wofstream, ..

    Dies beziehen sich beim Öffnen auch wieder auf fstream bzw so wie ich es verstehe
    candidate function not viable: no known conversion from 'std::__cxx11::wstring' (aka 'basic_string<wchar_t>') to 'const char *' for 1st argument



  • Wie gesagt, die Standard Library von MS hat hier einen passenden Konstruktor:
    https://docs.microsoft.com/en-us/cpp/standard-library/basic-ifstream-class?view=msvc-160#basic_ifstream


Log in to reply