Umlaute



  • Hi
    Ich hab ein Programm geschrieben welches ne Textdatei einliest und die Wörter in einem Vektor(später auch in einer Map speichert). Nun möchte ich, dass die Umalute aus der eingelesenen Datei bei der Ausgabe richtig dargestellt werden. Wie sollte ich da vorgehen? Am liebsten hätte ich ne Funktion die die einzelnen Wörter im Vektor durchgeht und dabei die Umlaute so "präpariert" dass sie später richtig ausgegeben werden. Ich habe auch schon im Konsolen-FAQ mir den post durchgelesen bekomme es aber trotzdem nicht hin.

    Ich denke jetzt an sowas wie

    if(vektor[10] == 'was kommt hier hin? :confused: ') vektor[10] = '\...<--und hier?';
    

    Ihr habt bestimmt mehr Ahnung als ich... 😞

    cya



  • In dem Fall ist es wohl am einfachsten, wenn du die Elemente (Zeichen) des Vektors einzeln durchgehst (Schleife) und mit einem switch auf die Umlaute (z. B. case 'ü') abprüfst. Wenn das Zeichen ein Umlaut ist (z. B. case 'ü'), dann ersetzt du es mit dem richtigen Wert für die Ausgabe (z. B. 129).

    Alles verstanden?



  • @AJ: Das bringt nicht sonderlich viel da er einen signed char hat und wieder vor dem selben Problem steht, oder?

    Der vector muss dann Elemente vom Typ 'unsigned char' halten?

    MfG SideWinder



  • Wie kann ich denn nen string machen der aus unsigned char besteht?



  • Genauso wie einen der aus signed chars besteht:

    unsigned char* UnsignedCharStr = new unsigned char [len];
    

    Oder arbeitest du mit der C++-Klasse std::string?

    std::basic_string<unsigned char> UnsignedCharStr;
    

    MfG SideWinder



  • Danke,
    Hab aber noch eine Frage: kann man mit diesem basic_string auch alles machen was man mit einem "normalen" string machen kann? Was ist überhaupt der Unterschied?
    Also ich denke jetzt so an string::substr oder an Vergleichsoperatoren. Kann man das Zeug auch bie basic_string anwenden?

    Hab jetzt in meinem Programm alle strings durch basic strings ersetzt, allerdings gibt der compiler massig Fehler aus...



  • Welche Fehler bekommst du denn? Ein std::string ist nur eine Typedef für std::basic_string<char>. Und ja du kannst mit einem std::basic_string<unsigned char> genau dasselbe machen wie mit einem std::basic_string<char>.

    Also würden mich jetzt die Fehler doch stark interessieren 🙂

    MfG SideWinder



  • SideWinder schrieb:

    @AJ: Das bringt nicht sonderlich viel da er einen signed char hat und wieder vor dem selben Problem steht, oder?

    Der vector muss dann Elemente vom Typ 'unsigned char' halten?

    MfG SideWinder

    Das Problem ist ja die Ausgabe bzw. unterschiedliche Zeichensätze. Das ü, dass man in den Quellcode schreibt hat einen anderen Wert als das ü, dass man eigentlich ausgeben will. Sagen wir mal der Editor, den du zum Erstellen des Quellcodes benutzt, speichert das eingegebene ü als 97. Nun willst du es ausgeben. Allerdings verwendet die Ausgabe eine ganz andere Zeichentabelle, bei der ein ü den Wert 129 hat. Das ist das Problem.

    Ob ein Char-Vektor nun unsigned ist oder nicht ist eigentlich egal (bei Strings auf jeden Fall).



  • SideWinder schrieb:

    @AJ: Das bringt nicht sonderlich viel da er einen signed char hat und wieder vor dem selben Problem steht, oder?
    Der vector muss dann Elemente vom Typ 'unsigned char' halten?

    dar war ganz schlecht.

    for(int i=0;i<v.size;++i){
     if(v[i]=='ü')
      v[i]=129;
    }
    

    klappt bei signed UND bei unsigned char.
    im falle von unsigned landet das selbe bitmster in v[i]. nur beim ANZEIGEN ALS INT schreibt er -2 statt 129.
    wen du schmerzen hast, 129 nem signed char zuzuweseln, dann schreib halt

    v[i]=-2;
    

    oder mach am besten ne (sgned) char-konstente namens UUML;



  • du hast recht volkard.
    deine lösung funktioniert gut. 👍

    Danke


Anmelden zum Antworten