Applikation Unicode tauglich machen

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
BlueShark
Beiträge: 79
Registriert: 28.02.2009, 18:55
Alter Benutzername: BlueShark

Applikation Unicode tauglich machen

Beitrag von BlueShark »

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
Benutzeravatar
Biolunar
Establishment
Beiträge: 154
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Re: Applikation Unicode tauglich machen

Beitrag von Biolunar »

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.
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 577
Registriert: 05.07.2003, 11:17

Re: Applikation Unicode tauglich machen

Beitrag von Lord Delvin »

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.
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
BlueShark
Beiträge: 79
Registriert: 28.02.2009, 18:55
Alter Benutzername: BlueShark

Re: Applikation Unicode tauglich machen

Beitrag von BlueShark »

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
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 577
Registriert: 05.07.2003, 11:17

Re: Applikation Unicode tauglich machen

Beitrag von Lord Delvin »

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ß
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Applikation Unicode tauglich machen

Beitrag von Krishty »

Ich verstehe das Problem nicht … warum nun eine eigene Klasse und warum unbedingt C++09?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 577
Registriert: 05.07.2003, 11:17

Re: Applikation Unicode tauglich machen

Beitrag von Lord Delvin »

Krishty hat geschrieben:Ich verstehe das Problem nicht … warum nun eine eigene Klasse und warum unbedingt C++09?
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.
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ß:-/
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Applikation Unicode tauglich machen

Beitrag von Krishty »

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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Unknown GER
Beiträge: 49
Registriert: 09.01.2003, 13:04

Re: Applikation Unicode tauglich machen

Beitrag von Unknown GER »

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];
}
Antworten