Jonathan_Klein Living Legend
Alter: 36 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 24.02.2007, 21:32 Titel: char cast |
|
|
Von GreveN:
Da ich denke, dass dieser leider nur sehr begrenzt einsetzbar ist (WinAPI), man aber leider auch des Öfteren einen entsprechenden Cast brauchen würde, wegen mangelnden Unicode-Supports in diversen Bibliotheken etc., hab' ich mich mal selber an die Lösung des Problems gemacht. Vorweg: Ich benutze die 'codecvt'-Facette, welche eigentlich für Zeichenkonvertierung gedacht ist, bewusst nicht, da mir die Handhabung... naja, etwas barbarisch erscheint und ich keinen erkennbaren Vorteil gegenüber der 'widen'- bzw. 'narrow'-Methode sehe, wenn da jemand mehr wissen sollte als ich, so bitte ich um Aufklärung...
So, hier der eigentliche Cast:
CPP: | #include <locale>
#include <string>
template<class dest_type, class source_type>
inline const std::basic_string<dest_type> char_cast(const std::basic_string<source_type>& source, const std::locale& loc = std::locale::classic());
template<>
inline const std::basic_string<char> char_cast(const std::basic_string<char>& source, const std::locale& loc)
{ return source; }
template<>
inline const std::basic_string<wchar_t> char_cast(const std::basic_string<wchar_t>& source, const std::locale& loc)
{ return source; }
template<>
inline const std::basic_string<wchar_t> char_cast(const std::basic_string<char>& source, const std::locale& loc)
{
wchar_t* const buf = new wchar_t[source.length()+1];
std::use_facet<std::ctype<wchar_t> >(loc).widen(source.data(), &source.data()[source.length()], buf);
buf[source.length()] = 0;
const std::basic_string<wchar_t> ret_str(buf);
delete[] buf;
return ret_str;
}
template<>
inline const std::basic_string<char> char_cast(const std::basic_string<wchar_t>& source, const std::locale& loc)
{
char* const buf = new char[source.length()+1];
std::use_facet<std::ctype<wchar_t> >(loc).narrow(source.data(), &source.data()[source.length()], '*', buf);
buf[source.length()] = 0;
const std::basic_string<char> ret_str(buf);
delete[] buf;
return ret_str;
} |
Also soviel zusagen gibt's ja eigentlich nicht, besonders wichtig war mir noch, voll kompatibel zu allen erdenklichen Zeichensätzen, regionalen Besonderheien etc. zusein, deshalb ist es möglich als 2. Parameter dem Cast ein Locale mit auf den Weg zu geben, ansonsten wird das gesetzte Standardlocale verwendet, ich verwende die 'ctype'-Facette eben dieses Locales, die 2 herrliche Methoden ('widen' und 'narrow') zur Verfügung stellt.
Sooo... soll eigentlich nur eine Denkanregung sein, wie man es imho besser machen kann, wer mag kann natürlich die 'codecvt'-Facette, Standard-C-Strings und vielleicht sogar einen 3. Parameter für die Konvertierung von 'wchar_t' zu 'char' für das Defaultzeichen verwenden. _________________ https://jonathank.de/games/ |
|