zeichen aus string mit index ansprechen(mit umlauten).
-
Ich in meinem Programm ist es notwendig, dass ich aus einem array, oder einem String ein einzelnes Zeichen per Index ansprechen und ausgeben kann. Ohne Sonderzeichen also im reinen ASCII hat es auch mit einem einfachen char* array geklappt. Aber sobald Sonderzeichen oder umlaute vorkommen funktionieren die Indize nicht mehr denn in UTF-8 werden Zeichen auch aus mehreren Bytes zusammengesetzt. Nun ist das Problem, wie ich dennoch den Index beibehalten kann, auch wenn im Zeichen vorher ein ä oder ö ist.
Bsp.:
char zeichen[] = "abäüs"; cout << sizeof(zeichen) << endl;Ausgabe:
8jeder Umlaut braucht also zwei byte, was zur folge hat, das s nun nicht mehr den Index 4, sondern 6 hat. Dies Problem versuche ich zu umgehen.
-
Verwandle den UTF-8 String in einen UCS-2 oder UCS-4 String, dann hast du das Problem nicht mehr und du kannst per Index auf die einzelnen Zeichen zugreifen.
Grüssli
-
Dravere schrieb:
Verwandle den UTF-8 String in einen UCS-2 oder UCS-4 String, dann hast du das Problem nicht mehr und du kannst per Index auf die einzelnen Zeichen zugreifen.
Grüssli
danke, aber wie kann ich das tun, ich hab noch nie damit gearbeitet.
-
RFC 3629 kannst du hier als TXT oder PDF holen:
http://ietfreport.isoc.org/rfc3600-3699.htmlDas RFC 3629 definiert den UTF-8 String und zeigt dir somit auch, wie du einen UTF-8 String z.B. in einen UCS-4 umwandelst. Um den UCS-4 zu speichern, könntest du die zwei Varianten benutzen:
// int ist meistens 4 Bytes gross std::basic_string<int> std::vector<int>Allerdings aufpassen bei der Ausgabe. Die Streams von C++ sehen int als eine Zahl und können nicht mit Unicode umgehen. Daher wäre auch die Möglichkeit, das folgende zu benutzen:
std::wstring // ist ein std::basic_string<wchar_t>Allerdings auch hier ist Vorsicht geboten.
wchar_tist auf Windows ein UCS-2, auf Linux/Unix meistens ein UCS-4. Zudem muss man andere Streams verwenden:
`std::wcoutstd::wcin
std::wstringstream
std::wfstream
usw.`
Grüssli
-
super, danke jetzt muss ich nur noch wissen, wie ich denn mein utf-8 char* sauber nach wchar_t* bzw nach wstring casten kann.
Der Windows/Linux unterschied stört mich jetzt wenig, es ist ja auf dem Lokalen PC überall identisch. Ich schreib bisher noch keine Netzwerkprogramme.
-
Wofür brauchst du das?
Nebenbei bringt dir das nach UCS-2 oder -4 casten auch nur bedingt was, weil ein Unicodecodepunkt (und das sollte meines Wissens in UCS genauso sein) nicht unbedingt einem Zeichen entspricht. Zum Beispiel kannst du ein ä auch als a + ¨ bauen.
-
Es ist ein Testprojekt. Es soll eine weitere Methode Zeichen einzugeben ermöglichen. Dazu brauche ich natürlich auch ein Alphabet etwa zu vergleichen mit dem Zeichensatz auf einer Tastatur. Da Brauche ich nunmal auch Umlaute. Nur sollte, wenn ich Zeichen 3 als umlaut deklariere Zeichen 4 unverändert bleiben. Dafür brauche ich wchar_t.
Aber ich sehe momentan nicht das Bedürfnis, so eine Umkodierungsfunktion selbst schreiben zu müssen.