Umnlaute darstellen



  • Hey,

    habe ein kleines Problemchen.

    Ich möchte einen Keybinder für den San Andreas Multiplayer programmieren, was ich soweit auch schon gut alleine hinbekommen haben, allerdings möchte ich die SendChat() Funktion der API, welche von einem externen Entwickler programmiert wurde, nutzen,, was ein kleines Problem mit den Umlauten darstellt.

    Ich habe bisher alle Keybinder in Autohotkey geschrieben, was super geklappt hat.
    Die Umlaute werden wunderbar im Chat angezeigt.

    Nun mache ich es mit c++ und die Umlaute werden umgewandelt, in bspw. einen Bruch (1/4).

    Was ich nicht verstehe ist Folgendes:
    In Autohotkey funktioniert es prima, was nahelegt, dass es nichts mit der SendChat() Funktion zu tun hat.
    Allerdings werden die Umlaute in einer QMessageBox (Qt) wunderbar angezeigt, was wieder darauf schließen lässt, dass es an der SendChat() Funktion der externen API liegt.

    Da die API Open Source ist, kann ich hier mal die Funktion posten:
    https://github.com/Slider1338/GTA-API/blob/master/source/SAMP.cpp#L441

    Mein Code sieht wie folgt aus:

    SendChat((char*)"üü");
    

    Danke im Voraus.

    Viele Grüße



  • https://www.c-plusplus.net/forum/39326-full
    Du darfst deine Lieblingssuchmaschine das nächste mal auch gerne selbst benutzen.



  • Hey,

    erstmal danke für die Antwort.

    Ich weiß nicht, woher du entnimmst, dass ich diese Seite nicht auch schon durch exzessives Googlen gefunden habe.

    Ich habe es bereits mehrfach ausprobiert, allerdings bekommt meine Anwendung beim Verwenden von bspw. der Konstante "AE" einen Crash ("Funktioniert nicht mehr", "Appcrash").

    Danke im Voraus.

    Grüße



  • Du sagst also, dass folgendes Programm bei dir abstürzt?:

    #include <iostream>
    
    int main()
    {
        const unsigned char AE = static_cast<unsigned char>(142);
        std::cout << AE << '\n';
    }
    




  • hardware schrieb:

    Du sagst also, dass folgendes Programm bei dir abstürzt?:

    #include <iostream>
    
    int main()
    {
        const unsigned char AE = static_cast<unsigned char>(142);
        std::cout << AE << '\n';
    }
    

    Vergessen zu erwähnen:
    Habe statt unsigned char* char verwendet, da ich dies besser in einen char Pointer umwandeln kann.

    char AE = static_cast<char>(142);
    SendChat((char*)AE);
    

    Kann das daran liegen?

    linkposter schrieb:

    http://www.joelonsoftware.com/articles/Unicode.html
    http://utf8everywhere.org/

    Danke, werde ich mir sicher mal durchlesen.


  • Mod

    Mr.Reese schrieb:

    char AE = static_cast<char>(142);
    SendChat((char*)AE);
    

    Kann das daran liegen?

    Es liegt da dran*. Du weißt nicht, wie Zeiger funktionieren, oder? Falls nein, kann ich es dir leider auch nicht im Rahmen eines Forenbeitrags beibringen. Allgemein gilt, dass du ganz genau von jedem Zeichen in deinem Code wissen musst, wo und warum du es benutzt. "Damit der Compiler nicht mehr meine Fehler anmeckert" ist beispielsweise eine denkbar schlechte Begründung für etwas wie (char*) . Letztlich wirst du die Sprache richtig lernen müssen, bevor du sie benutzen kannst, in C++ gibt es keine Sicherheitsnetze für Anfänger. Das gilt doppelt für die Benutzung von Bibliotheken im C-Stil, denn in C kann man sich noch sehr viel einfacher selbst ins Bein schießen. Also genau das, was du hier machst.
    Eine vielleicht leichter gangbare Variante wäre hier, dass du deine Nachrichten erst mit std::string oder std::stringstream (die kennst du? Wenigstens std::string?) zusammen setzt, denn die sind relativ anfängerfreundlich. Am Ende kannst du dann deren spezielle Memberfunktionen benutzen, um eine Zeichenkette im C-Stil zu erhalten.

    *: Der Fehler ist auch unmittelbar offensichtlich. Den hätte so ziemlich jeder hier gesehen, hättest du gleich den richtigen Code gezeigt.



  • Ist jetzt evtl. etwas Off- Topic aber zu:

    erst mit std::string oder std::stringstream (die kennst du? Wenigstens std::string?) zusammen setzt, denn die sind relativ anfängerfreundlich.

    => Ja, sind sie , generell aber : Sollte man die nicht immer nutzen, nicht nur als Anfänger? bzw.: Wie oft kommt es bei Euch Profis vor, das ihr in c++ char* benötigt ?



  • Selbstverständlich lautet der Grundsatz:
    Man sollte sie immer nutzen.



  • unsure schrieb:

    Ist jetzt evtl. etwas Off- Topic aber zu:

    erst mit std::string oder std::stringstream (die kennst du? Wenigstens std::string?) zusammen setzt, denn die sind relativ anfängerfreundlich.

    => Ja, sind sie , generell aber : Sollte man die nicht immer nutzen, nicht nur als Anfänger? bzw.: Wie oft kommt es bei Euch Profis vor, das ihr in c++ char* benötigt ?

    Also ich benutze regelmässig char*. Sogar ohne irgendwelches consts.

    Aber unfreiwillig: auf der Arbeit setze ich auf eine C-API auf (wobei die Bibliothek itnern wiederum komplett in C++ geschrieben ist mit Boost und allem drum und dran -.-'), die genau das erwartet...



  • SeppJ schrieb:

    Mr.Reese schrieb:

    char AE = static_cast<char>(142);
    SendChat((char*)AE);
    

    Kann das daran liegen?

    Es liegt da dran*. Du weißt nicht, wie Zeiger funktionieren, oder? Falls nein, kann ich es dir leider auch nicht im Rahmen eines Forenbeitrags beibringen. Allgemein gilt, dass du ganz genau von jedem Zeichen in deinem Code wissen musst, wo und warum du es benutzt. "Damit der Compiler nicht mehr meine Fehler anmeckert" ist beispielsweise eine denkbar schlechte Begründung für etwas wie (char*) . Letztlich wirst du die Sprache richtig lernen müssen, bevor du sie benutzen kannst, in C++ gibt es keine Sicherheitsnetze für Anfänger. Das gilt doppelt für die Benutzung von Bibliotheken im C-Stil, denn in C kann man sich noch sehr viel einfacher selbst ins Bein schießen. Also genau das, was du hier machst.
    Eine vielleicht leichter gangbare Variante wäre hier, dass du deine Nachrichten erst mit std::string oder std::stringstream (die kennst du? Wenigstens std::string?) zusammen setzt, denn die sind relativ anfängerfreundlich. Am Ende kannst du dann deren spezielle Memberfunktionen benutzen, um eine Zeichenkette im C-Stil zu erhalten.

    *: Der Fehler ist auch unmittelbar offensichtlich. Den hätte so ziemlich jeder hier gesehen, hättest du gleich den richtigen Code gezeigt.

    Ich versuche seit Längerem den Sinn von Zeigern zu verstehen, aber in jedem Buch, das ich besitze und in jedem Tutorial wird nur beschrieben, wie sie funktionieren, aber nirgendwo findet man praxisbezogene Anwendungsbereiche.
    Ich weiß bis heute nicht, wann man sie verwendet und wann nicht.

    Wie soll man denn c++ lernen, wenn man es nicht anwenden darf, weil man es noch nicht kann? Man kann nichts lernen, ohne dass man es ausprobiert, was ich an diesem Projekt versuche.

    Wie genau meinst du das mit dem std::string? Also den Datentyp kenne ich schon, habe auch schonmal mit ihm gearbeitet, weiß auch wie ich ihn zu einem char Array konvertiere (c_str()). Dennoch bringt mich das leider nicht weiter, da die Umlaute trotzdem noch in Brüchen angezeigt werden.

    Danke übrigens für die ganze Mühe, ich tu mich in c++ noch sehr schwer.

    Viele Grüße


Anmelden zum Antworten