Applikation Unicode tauglich machen
Applikation Unicode tauglich machen
Moin moin,
ich möchte in meinen Programmen endlich mal probieren Unicode zu verwirklichen. Die Frage ist nur, wie mache ich das? Ich hab gehört, dass C++ den wchar_t Datentyp zur Verfügung stellt. Doch von dem wird gesagt, dass der entweder 2 oder 4 Byte groß ist, sollte doch eigentlich kein Problem von der Handhabung sein, oder? Und wie sieht es überhaupt mit gewissen Grundfunktionen aus? Muss ich jetzt meine eigenen Stringklassen schreiben? Wie wandel ich int, float, und char in wchar um, damit ich das ganze als Text in ner Datei speichern kann, und das ganze natürlich auch anders herum?
Mfg
BS
ich möchte in meinen Programmen endlich mal probieren Unicode zu verwirklichen. Die Frage ist nur, wie mache ich das? Ich hab gehört, dass C++ den wchar_t Datentyp zur Verfügung stellt. Doch von dem wird gesagt, dass der entweder 2 oder 4 Byte groß ist, sollte doch eigentlich kein Problem von der Handhabung sein, oder? Und wie sieht es überhaupt mit gewissen Grundfunktionen aus? Muss ich jetzt meine eigenen Stringklassen schreiben? Wie wandel ich int, float, und char in wchar um, damit ich das ganze als Text in ner Datei speichern kann, und das ganze natürlich auch anders herum?
Mfg
BS
Re: Applikation Unicode tauglich machen
Kommt halt auf den Compiler an wie groß nun tatsächlich die ganzen Datentypen sind, die Handhabung ändert sich dadurch nicht.
Hast du denn bisher eine eigene Stringklasse verwendet oder std::string? std::string ist nämlich ein typedef auf std::basic_string<char>. Dementsprechend gibts das selbe auch in der wchar_t Variante std::wstring.
Analog dazu kann man zum Konvertieren die Standard Streams verwenden, also z.B. statt std::fstream std::wfstream usw... Eine andere Variante wäre boost::lexical_cast.
Hast du denn bisher eine eigene Stringklasse verwendet oder std::string? std::string ist nämlich ein typedef auf std::basic_string<char>. Dementsprechend gibts das selbe auch in der wchar_t Variante std::wstring.
Analog dazu kann man zum Konvertieren die Standard Streams verwenden, also z.B. statt std::fstream std::wfstream usw... Eine andere Variante wäre boost::lexical_cast.
- Lord Delvin
- Establishment
- Beiträge: 596
- Registriert: 05.07.2003, 11:17
Re: Applikation Unicode tauglich machen
Du wirst wohl feststellen, dass du von den chars nie ganz loskommst, wenn du viele libs verwendest, da manche leider nur char anbieten. Deswegen würd ich dir empfehlen mal in C++0x / gcc4.4 rein zu schaun und eventuell eine string klasse zu schreiben, die tut, was du brauchst und dafür strings/wstrings verwendet...ich glaub aber, dass es grad kein guter Zeitpunkt für sowas ist, weil es früher eher mehr arbeit war und sich da grad was zum guten hin ergibt.
Re: Applikation Unicode tauglich machen
Nun ja, ich will ja den guten alten char auch nicht aufgeben. Jedoch scheint es ja gerade durch den jetzt kommenden C++ Standard überflüssig zu werden selbst ne Sring Klasse aufzuziehen, worauf ich eh keine Lust hatte. Also werde ich wohl meinen Code weiterhin mit chars schreiben und dann erst später alles abändern. Obwohl das ist glaube ich ganz schön viel Puselkram, wenn man das nachträglich ändern will.
Moment mal. Kann es sein, dass in gcc4.4 die Unicode Strings schon integriert sind oder deute ich den Inhalt dieser Seite falsch?
http://gcc.gnu.org/gcc-4.4/cxx0x_status.html
Ich glaube nämlich schon^^. Also jedenfalls hab ich gcc4.4 schon zum download gefunden.
http://www.tdragon.net/recentgcc/
Nun muss ich das ganze nur noch installiert kriegen und in CodeBlocks einbinden. Hoffentlich gibt es dafür ein gutes Tutorial. Wo finde ich dann eigentlich eine Referenz, damit ich weiß, wie die Neuerungen funktionieren sollen?
Mfg
Harry
Moment mal. Kann es sein, dass in gcc4.4 die Unicode Strings schon integriert sind oder deute ich den Inhalt dieser Seite falsch?
http://gcc.gnu.org/gcc-4.4/cxx0x_status.html
Ich glaube nämlich schon^^. Also jedenfalls hab ich gcc4.4 schon zum download gefunden.
http://www.tdragon.net/recentgcc/
Nun muss ich das ganze nur noch installiert kriegen und in CodeBlocks einbinden. Hoffentlich gibt es dafür ein gutes Tutorial. Wo finde ich dann eigentlich eine Referenz, damit ich weiß, wie die Neuerungen funktionieren sollen?
Mfg
Harry
- Lord Delvin
- Establishment
- Beiträge: 596
- Registriert: 05.07.2003, 11:17
Re: Applikation Unicode tauglich machen
der tdm gcc hat bei mir nach einfachem drüberinstallieren sofort funktioniert. Du musst beim compiler glaub ich noch sowas wie -std=c++0x oder so ähnlich hinschreiben, die funktionsweisen sind im englischen wikipedia und auf der gcc seite gut dokumentiert. Das kann man bei den compileroptienen aber ganz gut machen mit Codeblocks. Ich hab vor n paar wochen mal mit 4.3 ein printf<...> geschrieben:D
Is aber zumindest so wie ich das machen wollte n größerer krampf, aber wenn man das format etwas ändert und nicht das printf format nimmt, dann is das vielleicht auf sinnvoll...wird wohl zeit für printt:)
siehe: http://gcc.gnu.org/gcc-4.4/cxx0x_status.html
Gruß
Is aber zumindest so wie ich das machen wollte n größerer krampf, aber wenn man das format etwas ändert und nicht das printf format nimmt, dann is das vielleicht auf sinnvoll...wird wohl zeit für printt:)
siehe: http://gcc.gnu.org/gcc-4.4/cxx0x_status.html
Gruß
- Krishty
- Establishment
- Beiträge: 8305
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Applikation Unicode tauglich machen
Ich verstehe das Problem nicht … warum nun eine eigene Klasse und warum unbedingt C++09?
- Lord Delvin
- Establishment
- Beiträge: 596
- Registriert: 05.07.2003, 11:17
Re: Applikation Unicode tauglich machen
In einer Idealen Welt, in der alle wchar_t/std::wstring verwenden, gibt es kein Problem...zumindest wenn in dieser idealen Welt wchar_t überall die selbe größe und Bedeutung hat, das ist aber in der Praxis zumindest bei mir kein Problem gewesen.Krishty hat geschrieben:Ich verstehe das Problem nicht … warum nun eine eigene Klasse und warum unbedingt C++09?
In der Praxis siehts aber leider so aus, dass du intern mit wchar_t rechnen willst, aber eine lib einen pfad oder sonst irgendwas als char braucht. Dann musst du das halt irgendwie so transformieren können, dass die lib mit deinem wchar arbeiten kann und das machst du am besten mit einer Stringklasse, die du solange erweiterst bis sie alles kann. Kostet dich auch nicht allzuviel zeit das zu schreiben.
C++09 ist interessant, weils jetzt native unterstützung und vor allem unterscheidung zwischen diversen nicht ascii formaten gibt, wie z.B. utf-8. Vor allem das utf-8 wird wohl hier interessant sein, weil man erfahrungsgemäß lange zeit utf-8 einfach nach char casten kann und in libs reinstopfen bevor die anfangen sich zu beschweren, dann entfällt vermutlich die eigene klasse auch wieder, aber ausprobiert hab ich das noch nicht...ich würd da auch ehrlich gesagt erst bis zum offiziellen release der Sprache warten, weil dann alle sehen Woah utf-8 das will ich auch und dann machen da auch die libs mit. Mit etwas Glück kommt das auch in C, dann hat man endlich nie wieder Probleme mit so nem scheiß:-/
- Krishty
- Establishment
- Beiträge: 8305
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Applikation Unicode tauglich machen
Okay. Wenn man aber die Funktionalität bündeln möchte, entscheidet man sich für ein Format (vorzugsweise das mächtigste, also wchar_t), das man in seinem Code überall einsetzt und castet es nur an den Reibungspunkten (API-Calls) zu dem Format, das die Fremd-API fordert (z.B. dem guten alten char). Vor allem führt man diesen Cast – wie man ihn implementiert, sei erst einmal dahingestellt – statisch aus.
Eine neue Klasse für so etwas zu basteln ist das schlimmste, was man machen kann … das ist, als würde man eine Zahlenklasse bauen, die Ganzzahlen, Gleitkommazahlen und Bruchzahlen auf einmal kapselte. Das beginnt nämlich damit, dass man alle Konstruktoren und Operatoren von std::string und std::wstring einbauen und an die entsprechende Implementation weiterleiten muss, wenn man halbwegs vernünftig damit arbeiten möchte … und endet mit der Frage, in welchem Format man die Strings – intern in der Stringklasse und auch beim Aufruf vom eigenen Code aus – letztendlich speichern möchte, ohne dass jeder hardgecodete String erst einmal konvertiert werden muss.
Dann kann man auch gleich den gemeinsamen Nenner finden, nur den benutzen und sich alles Drumherum, bis auf die Konvertierung selbst, sparen.
Was UTF-8 angeht, habe ich mich noch nicht tief genug in das Thema eingearbeitet, um das beurteilen zu können … ich fürchte aber ehrlich gesagt, dass es nicht so einfach wird … zumal noch ein String-Format den Libs wahrscheinlich nicht helfen können wird, die schon mit zweien nicht auskommen.
Eine neue Klasse für so etwas zu basteln ist das schlimmste, was man machen kann … das ist, als würde man eine Zahlenklasse bauen, die Ganzzahlen, Gleitkommazahlen und Bruchzahlen auf einmal kapselte. Das beginnt nämlich damit, dass man alle Konstruktoren und Operatoren von std::string und std::wstring einbauen und an die entsprechende Implementation weiterleiten muss, wenn man halbwegs vernünftig damit arbeiten möchte … und endet mit der Frage, in welchem Format man die Strings – intern in der Stringklasse und auch beim Aufruf vom eigenen Code aus – letztendlich speichern möchte, ohne dass jeder hardgecodete String erst einmal konvertiert werden muss.
Dann kann man auch gleich den gemeinsamen Nenner finden, nur den benutzen und sich alles Drumherum, bis auf die Konvertierung selbst, sparen.
Was UTF-8 angeht, habe ich mich noch nicht tief genug in das Thema eingearbeitet, um das beurteilen zu können … ich fürchte aber ehrlich gesagt, dass es nicht so einfach wird … zumal noch ein String-Format den Libs wahrscheinlich nicht helfen können wird, die schon mit zweien nicht auskommen.
-
- Beiträge: 49
- Registriert: 09.01.2003, 13:04
Re: Applikation Unicode tauglich machen
Ich verwende nur noch wchar_t und alles was damit zusammenhängt (std::w*). Ist doch schon fast lächerlich, dass man sich 2009 immer noch größtenteils mit 7-Bit-ASCII rumschlägt. :) Viele Bibliotheken haben irgendwo eine Konfigurationszeile im Code, in der man wchar_t beim Kompilieren einstellen kann. Wenn es doch mal nicht so klappt, hab ich Funktionen wie diese hier geschrieben:
Code: Alles auswählen
std::wstring toWideCharString(const std::string& multiByteString)
{
vector<wchar_t> buffer(multiByteString.size() + 1);
MultiByteToWideChar(CP_UTF8, 0, multiByteString.c_str(), multiByteString.size(), &buffer[0], buffer.size());
return &buffer[0];
}