linux-ka schriebHi, ich habe zwar schon ne menge mit C geschrieben, aber scheinbar kam ich dabei immer nur mit ASCII Zeichen aus. Ich würde gerne Strings verarbeiten, was problemlos funktioniert, wenn man von den Umlauten und ß absieht.
Du arbeitest wahrscheinlich mit Werkzeugen, die nicht sauber aufeinander abgestimmt sind, schätze mal Dein Editor benutzt einen Zeichensatz, Deine shell oder ein anderer Editor einen anderen. Probleme gibt's nur, wenn Du ein Gemisch hast. Es gibt dann sehr schnell kaputteditierte Dateien, die gleichzeitig Zeichen aus mehreren Zeichensätzen enthalten. Du mußt Dir darüber klar sein, daß in der Realität ein Gemisch von solchen Werkzeugen immer ein Problem, allerdings auch immer legitim ist. Du behältst folglich immer eine gewisse Verantwortung dafür.
linux-ka schriebIch habe zwar schon locale.h eingebunden, aber weiter komme ich damit leider nicht. wchar_t soll da weiterhelfen, aber wenn ich den jeweiligen String so deklariere zb wchar_t *string; und ihn via printf("%ls",string); ausgeben möchte, habe ich ein Ausgabeproblem ( zumal da schon der Compiler schreit).
Eine Verwendung von
wchar_t ist für UTF-8 nicht immer zwingend nötig. Es hängt davon ab, was Du machen, konkret ob Du strings wirklich manipulieren (oder nur einlesen und wieder ausgeben) willst.
wchar_t erweitert jedes Zeichen grundsätzlich auf zwei byte (entspricht also UTF-16!) und erfordert zudem einen anderen Satz an Funktionen und andere string-Konstanten, in C++ auch andere Klassen.
printf nutzt Dir da nix, Du brauchst dann
wprintf, statt
strlen brauchste
wcslen usw. Intern UTF-16 zu verwenden, wäre natürlich sauber, erfordert dann aber eben die Umstellung des gesamten Programms und einigen Aufwand an allen Schnittstellen nach draußen.
linux-ka schriebKann man denn auf einfachem Wege (zur not auch umständlich) den UTF-8 support einbinden, sodass man reibungslos mit den Strings arbeiten kann?
Einfach ist es nicht. Du mußt, wie gesagt, alle Ein- und Ausgaben, die Dein Programm macht, darauf umstellen, d.h. eine Prüfung und ggf. eine Konvertierung durchlaufen lassen und darfst dabei nirgends ein Loch lassen. Du wirst, da Du oft nicht wissen kannst, was von draußen kommt, konfigurierbare Vorgaben vorsehen, d.h. dem Programm irgendwie explizit sagen müssen, daß es diesen oder jenen Zeichensatz annehmen soll. Wenn es sich um große Datenmengen handelt, wird die Laufzeit interessant, denn die Konvertierung kostet natürlich Zeit. Zur Umwandlung von Zeichenketten kannste Funktionen wie
iconv benutzen. Du mußt aber eben wissen, was Du wohin konvertierst.