Unicode, UTF8 und Multiybyte - etwas verwirrt.



  • fang mal bei ascii (wikipedia) an und dann die weiteren unicode, UTF8...



  • Sind doch alles nur Bits und Bytes. Intern als Zahlen repräsentiert kann also garnicht sein. Und der L-Manipulator macht lediglich aus 8 bit ein 16 bzw. 32 bit (je nach Compiler). Sowas wie Zahlen gibt es im Computer nicht.

    Dir ist anscheinend nicht klar, wie ein Computer funktioniert.

    Neben der Lektüre was ASCII, UCS und UTF-x ist, hilft vielleicht das:
    http://www.kharchi.eu/wiki/doku.php?id=cpp:std:string



  • Scorcher24 schrieb:

    Nur was ist jetzt der genaue Unterschied zwischen UTF-8 und Unicode?

    Beides ist Unicode.

    Was du meinst ist Unicode 16 und 32.

    Der Unterschied zu UTF-8 ist, daß diese beiden feste Breiten haben.
    Also 2 oder 4 Byte.
    Während die Breite bei UTF-8 variieren kann.

    Der Rest steht in der Wikipedia.





  • dfhhjjkk schrieb:

    Beides ist Unicode.

    Was du meinst ist Unicode 16 und 32.

    Der Unterschied zu UTF-8 ist, daß diese beiden feste Breiten haben.
    Also 2 oder 4 Byte.
    Während die Breite bei UTF-8 variieren kann.

    Nicht ganz korrekt. Feste Breite hat nur UTF-32. UTF-16 und UTF-8 haben beide eine variable Länge. Im Fall von UTF-8 1-4 Bytes und im Fall von UTF-16 2/4 Bytes. UTF-16, L"" und wchar_t sind übrigens inzwischen deprecated und sollten nicht mehr verwendet werden. Statt dessen speichert man Unicode Texte normalerweise als UTF8 in einem char*. Will man mit den Zeichenketten allerdings arbeiten (substr, etc) empfielt sich hingegen ein basic_string<uint32_t>. Eine Konvertierungsfunktion zwischen UTF-8 und UTF-32 kann man relativ schnell selber schreiben.



  • Pedobear schrieb:

    dfhhjjkk schrieb:

    Beides ist Unicode.

    Was du meinst ist Unicode 16 und 32.

    Der Unterschied zu UTF-8 ist, daß diese beiden feste Breiten haben.
    Also 2 oder 4 Byte.
    Während die Breite bei UTF-8 variieren kann.

    Nicht ganz korrekt. Feste Breite hat nur UTF-32. UTF-16 und UTF-8 haben beide eine variable Länge. Im Fall von UTF-8 1-4 Bytes und im Fall von UTF-16 2/4 Bytes. UTF-16, L"" und wchar_t sind übrigens inzwischen deprecated und sollten nicht mehr verwendet werden. Statt dessen speichert man Unicode Texte normalerweise als UTF8 in einem char*. Will man mit den Zeichenketten allerdings arbeiten (substr, etc) empfielt sich hingegen ein basic_string<uint32_t>. Eine Konvertierungsfunktion zwischen UTF-8 und UTF-32 kann man relativ schnell selber schreiben.

    wo hast du das gelesen das wchar_t und L"" depricated sei?



  • wchar_t bzw. L"" sind 16 Bit breit, also zum speichern von UTF-16 oder anderen 16 Bit Codierungen gedacht. Da UTF-16 deprecated ist und andere Codierungen zu Gunsten von Unicode sowieso nicht mehr verwendet werden sollten, sind wchar_t und L"" ebenfalls deprecated.



  • Pedobear schrieb:

    wchar_t bzw. L"" sind 16 Bit breit, also zum speichern von UTF-16 oder anderen 16 Bit Codierungen gedacht.

    Nein. Unter meinem Linux zB hat wchar_t 32 Bit und speichert UTF-32.

    Pedobear schrieb:

    Da UTF-16 deprecated ist ...

    Schön wärs, aber offiziell ists glaub ich nicht so.



  • .filmor schrieb:

    Pedobear schrieb:

    wchar_t bzw. L"" sind 16 Bit breit, also zum speichern von UTF-16 oder anderen 16 Bit Codierungen gedacht.

    Nein. Unter meinem Linux zB hat wchar_t 32 Bit und speichert UTF-32.

    Mag sein. Aber das ist nicht portabel. Ergo: Sollte nicht verwendet werden.



  • Pedobear schrieb:

    wchar_t bzw. L"" sind 16 Bit breit, also zum speichern von UTF-16

    Nein! wchar_t ist eher für fixedsize Zeichensätze gedacht. UTF-16 dort reinzustecken ist eher eine Aushilfslösung.

    Pedobear schrieb:

    Da UTF-16 deprecated ist

    Quelle? Du meinst wohl eher UCS-2

    Pedobear schrieb:

    sind wchar_t und L"" ebenfalls deprecated.

    Pedobear schrieb:

    .filmor schrieb:

    Pedobear schrieb:

    wchar_t bzw. L"" sind 16 Bit breit, also zum speichern von UTF-16 oder anderen 16 Bit Codierungen gedacht.

    Nein. Unter meinem Linux zB hat wchar_t 32 Bit und speichert UTF-32.

    Mag sein. Aber das ist nicht portabel. Ergo: Sollte nicht verwendet werden.

    hö?



  • rüdiger schrieb:

    Pedobear schrieb:

    sind wchar_t und L"" ebenfalls deprecated.

    Pedobear schrieb:

    .filmor schrieb:

    Pedobear schrieb:

    wchar_t bzw. L"" sind 16 Bit breit, also zum speichern von UTF-16 oder anderen 16 Bit Codierungen gedacht.

    Nein. Unter meinem Linux zB hat wchar_t 32 Bit und speichert UTF-32.

    Mag sein. Aber das ist nicht portabel. Ergo: Sollte nicht verwendet werden.

    hö?

    wchar_t ist nicht immer 32 Bit breit! Also ist es nicht portabel und deprecated! Jetzt verstanden? 🙄



  • rüdiger schrieb:

    Pedobear schrieb:

    wchar_t bzw. L"" sind 16 Bit breit, also zum speichern von UTF-16

    Nein! wchar_t ist eher für fixedsize Zeichensätze gedacht. UTF-16 dort reinzustecken ist eher eine Aushilfslösung.

    Diese Aushilfslösung wird aber von vielen Windows Programmieren verwendet. Schau dir nur mal unseren Artikel an.



  • Pedobear schrieb:

    wchar_t ist nicht immer 32 Bit breit! Also ist es nicht portabel und deprecated! Jetzt verstanden? 🙄

    Sag mir, wie du auf anderem wege mit Betriebssystemfunktionen arbeiten willst. Wenn die nen wchar_t wollen, dann hast du ihnen einen wchar_t zu geben, sonst quittieren sie den dienst.



  • otze schrieb:

    Pedobear schrieb:

    wchar_t ist nicht immer 32 Bit breit! Also ist es nicht portabel und deprecated! Jetzt verstanden? 🙄

    Sag mir, wie du auf anderem wege mit Betriebssystemfunktionen arbeiten willst. Wenn die nen wchar_t wollen, dann hast du ihnen einen wchar_t zu geben, sonst quittieren sie den dienst.

    Ich sprach von Portabilität. Wenn man portabel sein möchte, verwendet man für Gewöhnlich auch keine Betriebssystemfunktionen sondern die Standardbibliothek oder boost oder etwsa ähnliches.
    Wenn du allerdings nicht portabel sein möchtest, weißt du ja wie groß deine Datentypen sind und kannst auch wchar_t benutzen. Dann bleibst du dann allerdings auf Windows beschränkt.



  • also, wenn alles was nicht portabel ist auch deprecated ist, dann ist ja fast alles in C++ deprecated.



  • ähm schrieb:

    also, wenn alles was nicht portabel ist auch deprecated ist, dann ist ja fast alles in C++ deprecated.

    Nö, C++ ist eigentlich sehr portabel.



  • Pedobear schrieb:

    otze schrieb:

    Pedobear schrieb:

    wchar_t ist nicht immer 32 Bit breit! Also ist es nicht portabel und deprecated! Jetzt verstanden? 🙄

    Sag mir, wie du auf anderem wege mit Betriebssystemfunktionen arbeiten willst. Wenn die nen wchar_t wollen, dann hast du ihnen einen wchar_t zu geben, sonst quittieren sie den dienst.

    Ich sprach von Portabilität. Wenn man portabel sein möchte, verwendet man für Gewöhnlich auch keine Betriebssystemfunktionen sondern die Standardbibliothek oder boost oder etwsa ähnliches.
    Wenn du allerdings nicht portabel sein möchtest, weißt du ja wie groß deine Datentypen sind und kannst auch wchar_t benutzen. Dann bleibst du dann allerdings auf Windows beschränkt.

    und was ist mit den mb*wc(s) und den wc* funktionen in der standard c library?
    die gibt es beide unter Windows und unter Linux(für andere Betriebsysteme wie *BSD und andere weis ich es nicht) und jeweils mit wchar_t als einen der erwarteten Parameter.
    z.b. mbstrtowcs und wcstombs



  • firefly schrieb:

    Pedobear schrieb:

    otze schrieb:

    Pedobear schrieb:

    wchar_t ist nicht immer 32 Bit breit! Also ist es nicht portabel und deprecated! Jetzt verstanden? 🙄

    Sag mir, wie du auf anderem wege mit Betriebssystemfunktionen arbeiten willst. Wenn die nen wchar_t wollen, dann hast du ihnen einen wchar_t zu geben, sonst quittieren sie den dienst.

    Ich sprach von Portabilität. Wenn man portabel sein möchte, verwendet man für Gewöhnlich auch keine Betriebssystemfunktionen sondern die Standardbibliothek oder boost oder etwsa ähnliches.
    Wenn du allerdings nicht portabel sein möchtest, weißt du ja wie groß deine Datentypen sind und kannst auch wchar_t benutzen. Dann bleibst du dann allerdings auf Windows beschränkt.

    und was ist mit den mb*wc(s) und den wc* funktionen in der standard c library?
    die gibt es beide unter Windows und unter Linux(für andere Betriebsysteme wie *BSD und andere weis ich es nicht) und jeweils mit wchar_t als einen der erwarteten Parameter.
    z.b. mbstrtowcs und wcstombs

    Die sind für leagcy Programme gedacht, die noch mit alten Codierungen umgehen müssen. Nichts, was man in modernen Programmen verwenden sollte..



  • Pedobear schrieb:

    firefly schrieb:

    Pedobear schrieb:

    otze schrieb:

    Pedobear schrieb:

    wchar_t ist nicht immer 32 Bit breit! Also ist es nicht portabel und deprecated! Jetzt verstanden? 🙄

    Sag mir, wie du auf anderem wege mit Betriebssystemfunktionen arbeiten willst. Wenn die nen wchar_t wollen, dann hast du ihnen einen wchar_t zu geben, sonst quittieren sie den dienst.

    Ich sprach von Portabilität. Wenn man portabel sein möchte, verwendet man für Gewöhnlich auch keine Betriebssystemfunktionen sondern die Standardbibliothek oder boost oder etwsa ähnliches.
    Wenn du allerdings nicht portabel sein möchtest, weißt du ja wie groß deine Datentypen sind und kannst auch wchar_t benutzen. Dann bleibst du dann allerdings auf Windows beschränkt.

    und was ist mit den mb*wc(s) und den wc* funktionen in der standard c library?
    die gibt es beide unter Windows und unter Linux(für andere Betriebsysteme wie *BSD und andere weis ich es nicht) und jeweils mit wchar_t als einen der erwarteten Parameter.
    z.b. mbstrtowcs und wcstombs

    Die sind für leagcy Programme gedacht, die noch mit alten Codierungen umgehen müssen. Nichts, was man in modernen Programmen verwenden sollte..

    und was soll man dann deiner Meinung nach in modernen Programmen verwenden?



  • firefly schrieb:

    Pedobear schrieb:

    firefly schrieb:

    Pedobear schrieb:

    otze schrieb:

    Pedobear schrieb:

    wchar_t ist nicht immer 32 Bit breit! Also ist es nicht portabel und deprecated! Jetzt verstanden? 🙄

    Sag mir, wie du auf anderem wege mit Betriebssystemfunktionen arbeiten willst. Wenn die nen wchar_t wollen, dann hast du ihnen einen wchar_t zu geben, sonst quittieren sie den dienst.

    Ich sprach von Portabilität. Wenn man portabel sein möchte, verwendet man für Gewöhnlich auch keine Betriebssystemfunktionen sondern die Standardbibliothek oder boost oder etwsa ähnliches.
    Wenn du allerdings nicht portabel sein möchtest, weißt du ja wie groß deine Datentypen sind und kannst auch wchar_t benutzen. Dann bleibst du dann allerdings auf Windows beschränkt.

    und was ist mit den mb*wc(s) und den wc* funktionen in der standard c library?
    die gibt es beide unter Windows und unter Linux(für andere Betriebsysteme wie *BSD und andere weis ich es nicht) und jeweils mit wchar_t als einen der erwarteten Parameter.
    z.b. mbstrtowcs und wcstombs

    Die sind für leagcy Programme gedacht, die noch mit alten Codierungen umgehen müssen. Nichts, was man in modernen Programmen verwenden sollte..

    und was soll man dann deiner Meinung nach in modernen Programmen verwenden?

    Wie ich oben schon sagte: UTF-8 (char*) zum speichern von Unicode, da es die kürzeste der Unicode-Codierungen ist und UTF-32 (basic_string<uint32_t>) zum bearbeiten von Unicode, da man dann keine Probleme mit variabler Zeichenbreite hat.


Anmelden zum Antworten