Bytes verstehen (Netzwerk)



  • TyRoXx schrieb:

    wchar_t sollte man nie benutzen, weil unportabel und doofes Konzept.

    Kannst du das näher Erläutern bzw. mir weitere Links schicken (oder einen Suchbegriff nennen)? Warum gibt es dann std::wstring ?

    TyRoXx schrieb:

    char ist für UTF-8 geeignet und das ist im Web die geeignete Kodierung.

    Wtf - ich dachte, dass char auf den aller meisten Systemen nur 1 Byte hat. Wie soll da ein UTF-8 Zeichen reinpassen?

    TyRoXx schrieb:

    Ein HTTP-Header verwendet ASCII, also wieder char .

    Endlich mal eine ordentliche Aussage. Warum finde ich so was klares nie im Web?

    TyRoXx schrieb:

    send() nimmt char * , da könnte aber auch void * oder jeder andere Zeigertyp stehen. Es sendet reine Daten ohne bestimmte Kodierung.

    Mhh, okay... Also muss ich mir es quasi so vorstellen, als ob char gewählt wurde, um Bytes zu repräsentieren. Korrekt?

    TyRoXx schrieb:

    Endianness spielt hier keine Rolle.

    Warum eigentlich nicht? Normalerweise ist so etwas bei Netzwerkprogrammierung doch wichtig, oder nicht?



  • theliquidwave schrieb:

    TyRoXx schrieb:

    Endianness spielt hier keine Rolle.

    Warum eigentlich nicht? Normalerweise ist so etwas bei Netzwerkprogrammierung doch wichtig, oder nicht?

    Nur, wenn Du so etwas machen willst:

    ...
    
    int x;
    
    ...
    
    send(sock, (char *)&x, sizeof(int), 0);
    

    Weil auf Systemen mit unterschiedlicher Endianness die Bytes der Ganzzahltypen in unterschiedlicher Reihenfolge im Speicher liegen.
    Solange Du lediglich Zeichen herumschickst, ist Endianness irrelevant.



  • Ah, ich verstehe. Weil hier ja das Encoding zuständig ist 🤡
    Danke für die Erläuterung!


  • Mod

    theliquidwave schrieb:

    TyRoXx schrieb:

    char ist für UTF-8 geeignet und das ist im Web die geeignete Kodierung.

    Wtf - ich dachte, dass char auf den aller meisten Systemen nur 1 Byte hat. Wie soll da ein UTF-8 Zeichen reinpassen?

    Genau das ist doch der Trick an UTF-8: Die Zeichen werden als normale 8-Bit chars codiert, bei Bedarf nimmt man eben mehrere davon für ein einzelnes Zeichen. Vorteil ist, dass man an Programmen nicht viel (oder idealerweise überhaupt nichts) ändern muss. Wenn sie mit char-Ketten umgehen können, dann können sie auch UTF-8. Nachteil ist, dass die Länge einer Zeichenkette in Byte nicht mehr (unbedingt) der Länge in Zeichen entspricht, was einiges verkompliziert und Programme, die hiervon ausgehen, funktionieren nicht mehr.

    http://en.wikipedia.org/wiki/Utf-8



  • Hört sich für mich ziemlich nach Rumgefrickel an.
    Wieso verwende ich nicht gleich wchar_t ? Da habe ich doch die Garantie, dass es immer gleich lang ist. Probleme ergeben sich dann doch erst gar nicht? Oder hat es andere Nachteile? (Speicherplatzverbrauch mal außen vorgelassen)



  • theliquidwave schrieb:

    Wieso verwende ich nicht gleich wchar_t ? Da habe ich doch die Garantie, dass es immer gleich lang ist.

    wchar_t ist keine Codierung, genau wie char keine ist. Und gleich lang ist das auch nicht überall, die Länge von wchar_t ist nämlich nicht standardisiert.



  • Jahrelang irgendwas machen bedeutet nicht automatisch dass mein ein Profi oder Experte ist, wo dieser Unsinn immer herkommt 🙄



  • frickli schrieb:

    Jahrelang irgendwas machen bedeutet nicht automatisch dass mein ein Profi oder Experte ist, wo dieser Unsinn immer herkommt 🙄

    Wie gut, dass ich das nie behauptet habe 🤡

    Danke für die Erklärungen 😉



  • theliquidwave schrieb:

    wchar_t ? Da habe ich doch die Garantie, dass es immer gleich lang ist.

    Die Garantie hast du nicht.

    Wenn ich mit nicht irre, ist wchar_t auf Windows 2 Byte groß. Windows benutzt aber utf-16, also hast du auch bei wchar_t das Problem, dass nicht jedes Zeichen in einen wchar_t passt. Bei utf-16 gibt es Zeichen, für die zwei aufeinanderfolgende wchar_t benötigt werden.



  • Wenn du ein wenig Englisch kannst, hier wird vieles gut erklärt:
    http://www.joelonsoftware.com/articles/Unicode.html


Anmelden zum Antworten