TCHAR string
-
Stimmt, ich wusste noch gar nicht, dass es auch in der UTF-16 Kodierung möglich ist, höherwertige Zeichen darzustellen. Das scheint jedoch nur in seltenen Fällen in ostasiatischen Sprachen nötig zu sein. Die benutzen dann auch gleich lieber UTF-32.
Deshalb hast du jetzt natürlich streng genommen trotzdem Recht, weil die Möglichkeit besteht.
-
@Optimizer
wie, die nehmen gleich UTF-32? Es geht doch darum, dass dein Programm Unicode kompatibel ist, das ist es aber nicht, wenn du damit nicht alle Zeichen abspeichern kannst, vorallem kannst du so sicher einige lustige effekte/Abstürze erzeugen. Ich weiss aber nicht in wie fern Windows UTF-16 unterstützt oder noch auf UCS-2 basiert.Fakt ist nur, für aktuelles Unicode braucht man 32Bit und wenn eine Anwendung Unicode kompatibel sein will, kann man da nicht mit UCS-2 oä. rumwurschteln.
(Persönlich finde ich UTF-16 übrigens nicht so toll, ist irgend wie ein dummer Kompromiss zwischen UTF-8 und UTF-32 :))
-
Die nehmen teilweise (ich weiß aber nicht, ob größtenteils) das UTF-32 Encoding, um dieses multibyte-System zu vermeiden. Die Nachteile sind ja hinlänglich bekannt.
Es geht doch darum, dass dein Programm Unicode kompatibel ist, das ist es aber nicht, wenn du damit nicht alle Zeichen abspeichern kannst
Mir ist gerade der Zusammenhang nicht klar. Für die allermeisten Texte reichen 16 Bit pro Zeichen aus und deshalb ist UTF-16 auch eigentlich die gebräuchlichste Codierung.
Fakt ist nur, für aktuelles Unicode braucht man 32Bit und wenn eine Anwendung Unicode kompatibel sein will, kann man da nicht mit UCS-2 oä. rumwurschteln.
Das kommt auf den Text an.
Wenn ich mich in meinem Programm auf europäische Zeichen beschränke kann ich UTF-16 nehmen und bin trotzdem Unicode-kompatibel. Unicode schreibt ja nur die Kodierung vor (also den numerischen Wert eines Zeichens), sowie einige Umwandlungen zwischen Caps und dergleichen, aber nicht die Anzahl Bytes pro Zeichen.
-
string, wstring
-
Mir ist gerade der Zusammenhang nicht klar. Für die allermeisten Texte reichen 16 Bit pro Zeichen aus und deshalb ist UTF-16 auch eigentlich die gebräuchlichste Codierung.
für die meisten würde sicher auch UTF-8 reichen
Wenn ich mich in meinem Programm auf europäische Zeichen beschränke kann ich UTF-16 nehmen und bin trotzdem Unicode-kompatibel.
UTF-16 ist ja eh Unicode kompatibel, da 32Bit auf 16Bit abgebildet werden
UCS-2 ist aber nicht UTF-16...
-
Es ging mir eigentlich nur um diesen Satz. Vielleicht wäre er weniger misverständlich gewesen, wenn du geschrieben hättest "... für vollständigen Unicode ..."
Fakt ist nur, für aktuelles Unicode braucht man 32Bit
Von UCS-2 hab ich auch nie geredet. Aber das ist jetzt Erbsenzählerei.
-
man braucht maximal eben 32Bit für Unicode, wie man die verteilt, ist egal
Leider ist unter Windows wchar_t idr. 16Bit groß, so dass man mit UTF-16 rumpröckern muss. Und wie gesagt, finde ich persönlich UTF-16 als schlechten Kompromiss aus UTF-8 und UTF-32.
-
kingruedi schrieb:
man braucht maximal eben 32Bit für Unicode, wie man die verteilt, ist egal
Leider ist unter Windows wchar_t idr. 16Bit groß, so dass man mit UTF-16 rumpröckern muss. Und wie gesagt, finde ich persönlich UTF-16 als schlechten Kompromiss aus UTF-8 und UTF-32.
Nein, wie ich bereits geschrieben habe, hängt es vom Text und den verwendeten Zeichen ab, wieviel Bits man braucht. Unicode schreibt den numerischen Wert vor und nicht, dass man 4 Bytes lesen muss, um ein Zeichen zu haben.
Das hat auch mit "verteilen" nichts zu tun. Wenn ein Zeichen x den Code \uAC04 hat, dann kann ich UTF-16 für die Kodierung verwenden und es ist trotzdem Unicode-codiert.UTF-16 reicht zum Glück fast immer. Ich hätte nichts dagegen, wenn Windows und Java UTF-32 verwenden würden, aber jetzt ist es nun mal leider so und es ist wenigstens ist es schon mal deutlich besser als ANSI.
Bevor wir UTF-32 einführen, müssen wir erstmal alle Leute davon überzeugen, überhaupt Unicode zu verwenden. Das wird noch lange genug dauern, bis wir so weit sind.
Es ist btw. nicht direkt ein Kompromiss, die Einführung von UTF-32 war zunächst gar nicht erst geplant, weil man dachte 2 Bytes wären genug. Kann man irgendwo auf unicode.org nachlesen.
-
wie gesagt, es geht darum, das man 32Bit braucht, dass man auch mit Multibyte Sequenzen da tricksen kann ist eine andere Sache, aber die brauchen eben auch 32Bit im Worst-Case
UCS-2 war der Unicode Standard, der 2 Byte erwartet hat. Deswegen ist es ja bei Windows so, dass wchar_t als Unicode Typ 2 Byte hat. Da es mittlerweile einen neuen Unicode Standard gibt, musst du dann eben UTF-16 nehmen um Unicode kompatibel zu sein. Und das bringt Probleme mit, da es eben ein Multibyte Format ist und so zB. nicht in basic_string gespeichert werden kann und mehr Laufzeitkosten hat, da zB. Dinge wie die Länge eines Strings zu bestimmen kompilizierter werden. Und wenn man Speicherplatz sparen will ist UTF-8 besser. Deswegen finde ich, dass UTF-16 ein schlechter Kompromiss ist, aber das ist wohl die Folge des veralteten UCS-2 Unicode Standards.
-
für die meisten würde sicher auch UTF-8 reichen
Wieso das? Das gilt vielleicht für Europa, Asien ist aber nicht gerade klein und hat auch eine entsprechende Bedeutung.
Lustig ist z.B. auch, das UTF-8-Strings bei europäischen Texten meist kürzer sind (vom Platzbedarf), als UTF-16-Strings, bei asiatischen Texten ist es aber genau umgekeht, da meist 3 Bytes benötigt werden und bei UTF-16 meistens dann nur 2.Wie auch immer, ein einzelner 2 Byte Block reicht nicht um ein Unicode-Zeichen zu enthalten. Das ändert aber nichts daram, dass ich Texte UTF-16 encodieren kann, wobei der Platzbedarf dann aber nicht von der Anzahl der zeichen alleine bestimmt wird, sondern auch davon, welche Zeichen verwendet werden. Und wstring ist nicht dafür geeignet.
-
Wie auch immer, ein einzelner 2 Byte Block reicht nicht um ein Unicode-Zeichen zu enthalten. Das ändert aber nichts daram, dass ich Texte UTF-16 encodieren kann, wobei der Platzbedarf dann aber nicht von der Anzahl der zeichen alleine bestimmt wird, sondern auch davon, welche Zeichen verwendet werden. Und wstring ist nicht dafür geeignet.
ich hab nichts anderes behauptet.