Unicode-Stringklasse
-
Um Unicode kommt man heutzutage ja kaum noch herum.
Ich wollte nun meine Stringklasse um eine Unicode-Stringklasse ergänzen (UTF-16), allerdings bekomme ich die Realisierung nicht hin. Bei Google konnte ich leider nichts gescheites finden und die allgemeinen Infos auf Unicode.org sind alles andere als hilfreich.Was ich brauche:
- Transcodieren zwischen Unicode und nicht-Unicode
- Normalisieren (warum gibt es da so viele verschiedene Formen?)
- Stringfunktionen (Länge, Substrings, Verbinden, etc.)Wäre nett, wenn mir jemand erklären kann, wie ich das schaffe, oder gute Tutorials kennt. Ich suche keine fertigen Libraries und Klassen, dabei lerne ich nichts

Grüße,
Neku
-
Hi!
http://www.flipcode.com/articles/article_advstrings01.shtml
http://www.flipcode.com/articles/article_advstrings02.shtmlgrüße
-
Danke für deine Antwort, aber diese Tutorials nutzen vordefinierte Funktionen wie z.B. WideCharToMultiByte (WinAPI). Ich wollte jedoch solche Funktionen (auch wegen der Portabilität) selbst schreiben.
-
Hi!
Scroll runter und schau dir den Quellcode zu dem Tutorial an...
Warum lesen sich die Leute nicht alles gründlich durch bevor sie Antworten???
grüße
-
Der Quellcode war das einzige, was ich mir auf die Schnelle angesehen habe. Zum Konvertieren wird "WideCharToMultiByte" verwendet, was nicht in Frage kommt.
-
Hi!
Ok, nochmal gaaaanz langsam!
Wo findest du hier ein WideCharToMultiByte???http://www.flipcode.com/articles/article_advstrings_cstring.h
Ich sehe da vielmehr folgendes:
//======================================================= // // Conversion functions // TAnsiChar *ToAnsi(TAnsiChar *Buffer, int BufferLen) const // Converts the string to an ANSI string. { int i, ConvertLen; if (BufferLen <= 0) { Buffer = NULL; return Buffer; } if (BufferLen >= Len) ConvertLen = Len; else ConvertLen = BufferLen-1; for (i=0 ; i<ConvertLen ; i++) { #ifdef _UNICODE if (Text[i] > 255) // If character is a non-ANSI Unicode character, fill with Buffer[i] = 0x20; // space instead. else #endif Buffer[i] = (TAnsiChar)Text[i]; } Buffer[i] = A('\0'); return Buffer; } TUnicodeChar *ToUnicode(TUnicodeChar *Buffer, int BufferLen) const // Converts the string { // to a Unicode string. int i, ConvertLen; if (BufferLen <= 0) { Buffer = NULL; return Buffer; } if (BufferLen >= Len) ConvertLen = Len; else ConvertLen = BufferLen-1; for (i=0 ; i<ConvertLen ; i++) Buffer[i] = (TUnicodeChar)Text[i]; Buffer[i] = U('\0'); return Buffer; }Also, nich immer alles auf die Schnelle machen!
grüße
-
uuh danke, hab net gesehen, dass es da noch Downloads gibt

Das ist aber keine Konvertierung, das ist ne Krankheit
Da werden ja alle Unicodezeichen > 00FF einfach ignoriert und Encoding wird auch nicht beachtet.*Edit*
Vielleicht wurde das nicht ganz klar: Es geht vor allem darum, dass verschiedene Encodings unterstützt werden.
-
Was willst du sonst mit den Zeichen machen? Der Ansi-Code kennt nunmal nur Zeichen im Bereich von 0-255, alle anderen Zeichen können logischerweise mit diesem Zeichensatz gar nicht dargestellt werden.
Unicode hat keine verschiedene encodings...
Was man der Klasse spendieren könnte, wäre eine Funktion IsConvertibleToAnsi und der ToAnsi Funktion nen Standardzeichen, das verwendet wird um nichtdarstellbare Zeichen im Ansi-String "auszudrücken".
Was du willst ist wohl ne UCS-32 Stringklasse welche Funktionen à la ToAnsi, ToAscii, ToUnicode, ToUTF8, ToUCS-16,... hat.
-
Ich habe vorhin etwas über Unicode gelesen, da wurde auch unter anderem erklärt, dass ANSI nur 7-Bit-Strings sind (hab mich nie genau damit befasst). Dann gibt es noch die ISO-8859-*-Encodings, welche 8 Bit haben, sowie spezielle Encodings für asiatische Sprachen.
Ich möchte eine Stringklasse erstellen, die zwischen ANSI und den 8-Bit Encodings und Unicode hin und her encodieren kann. Die ISO-8859-* Mappingtabellen habe ich inzwischen unter http://www.unicode.org/Public/MAPPINGS/ISO8859/ gefunden. Was mir hier noch fehlt ist das Mapping für asiatische Encodings nach Unicode, aber die werden da auch irgendwo sein.
Was ich nun noch brauche:
- Wie man einen String normalisiert und was das bedeutet.
- Stringfunktionen (Länge, Substrings, Verbinden, etc.), da es hier anscheinend mehrere Dinge zu beachten gibt bei Unicode.
-
Bei asiatischen Sprachen wünsch ich dir viel Spaß, die haben da ettliche verschiedene eigene Standards und dann hat die westliche Welt für diese noch eigene Standards geschaffen.
Noch was ANSI ist nicht Ascii, Ascii ist 7Bit, der ANSI-Zeichensatz ist 8Bit. Glaub nicht gleich alles was du im inet liest, gibt genug Leute die Müll erzählen.