Das C++-GUI-String-Dilemma
-
GPC schrieb:
Na ja, wie ist das eigentlich beim C++ Nachfolger, ich nehme mal an da ist Unicode im Standard drin, oder?
Welcher C++-Nachfolger?
Grundsätzlich hat C++ für UTF16 Funktionen und Klassen im Standard drin, inklusive zahlreicher Funktionen dafür. Nur verwendet es keiner... hab noch nie ein Buchbeispiel zu C++ gesehen, daß wchar_t & Co verwendet.
-
ich hab schon ziemlich oft std::basic_string<TCHAR> gesehen, was ja im Unicode-Build zu std::basic_string<wchar_t> wird. das kann man doch wunderbar im zusammenhang mit der winapi benutzen.
-
Es wird doch gerade an einem neuen Standard gewerkelt, oder sehe ich das falsch?
Verfolge das nämlich nicht direkt.Es ist auch nicht so einfach ein wchar_t zu verwenden, weil einige Funktionen der Standardbibliothek nicht so schön damit funktionieren, jedenfalls hab ich die Erfahrung gemacht. strlen z.B. kannst du jedenfalls schon mal vergessen.
EDIT: Wieso verwendet wchar_t eigentlich keiner? Das Thema ist doch recht heikel!
-
GPC schrieb:
Es ist auch nicht so einfach ein wchar_t zu verwenden, weil einige Funktionen der Standardbibliothek nicht so schön damit funktionieren, jedenfalls hab ich die Erfahrung gemacht. strlen z.B. kannst du jedenfalls schon mal vergessen.
wcslen
-
Marc++us schrieb:
Grundsätzlich hat C++ für UTF16 Funktionen und Klassen im Standard drin, inklusive zahlreicher Funktionen dafür. Nur verwendet es keiner... hab noch nie ein Buchbeispiel zu C++ gesehen, daß wchar_t & Co verwendet.
Nein hat C++ nicht. Genau das ist ja das Problem. std::basic_string ist nicht für Multibyte Kodierungen geeignet und je nach Platform ist wstring (basic_string<wchar_t>) für UTF32 (also 32Bit ausgelegt) oder für UCS2 (16Bit). Wenn jemand in einen basic_string UTF16 reinpackt, ist das imho nicht mehr als ein Hack.
Aber C++ und Unicode ist echt problematisch. Es gibt auch keine portable Thirdparty Library, die dafür ausgelegt ist.
@GPC
für wchar_t muss man eben die wchar_t und nicht die char-Funktionen benutzen. Entsprechend man: wcslen(3) usw.
-
Ah, ok. Dann werd ich mich mal über die oben genannten Funktionen schlau machen. Danke dir.
-
kingruedi schrieb:
Wenn jemand in einen basic_string UTF16 reinpackt, ist das imho nicht mehr als ein Hack.
Deckt aber 99% aller praxisrelevanten Fälle ab. Solange length() funktioniert...
Mal im Ernst, einen Hack sehe ich hier nicht. Das <T> steht doch dafür, daß ich hier einen beliebigen Typ reinpacken darf, solange er alle notwendigen Operatoren anbietet. wchar_t erfüllt das durchaus.
Multibytekonvertierungen wird man außer beim File-IO doch wohl sowieso kaum verwenden, UTF16 deckt weitreichende Fälle ab. Und sobald man UTF8 codieren muß, kommt man ohne eine mehrere megabytegroße Tabelle ohnehin nicht mehr aus.
Ich glaube der Hauptgrund für CString, TString und QString ist eher der, daß die Klasse basic_string<> von C++ keine vielseitigen Memberfunktionen hat. Und wenn man dann sowieso zu was anderem greifen muß, nimmt man dann gleich die Klasse der GUI-Lib, fertig.
-
Es muss eigentlich prinzipbedingt schon ein Hack sein. Ein String soll eine Zeichenkette darstellen. Sobald der String nicht mehr weiß, was ein Zeichen ist und was nicht, ist er nicht mehr mehr als ein Buffer. length() funktioniert halt eben nicht. Nach deiner Logik kann man auch ein Bitmap in einen basic_string<char> packen, da würde dann sogar length() wieder funktionieren.
-
Außerdem, würdest du es riskieren, nur weil bei deinen westlichen Texten gerade alles passt, wstring zu verwenden? Ich nicht. Ich kenne kaum eine lib für C++ die das riskiert. Für den Firefox hat man gar 5 verschiedene String-Klassen geschrieben, IMHO std::string wirklich gar nicht benutzt. Schon lustig, man findet kaum eine Java-lib ohne java.lang.String aber man findet auch kaum eine C++ - lib mit std::string.
-
Optimizer schrieb:
Außerdem, würdest du es riskieren, nur weil bei deinen westlichen Texten gerade alles passt, wstring zu verwenden? Ich nicht. Ich kenne kaum eine lib für C++ die das riskiert. Für den Firefox hat man gar 5 verschiedene String-Klassen geschrieben, IMHO std::string wirklich gar nicht benutzt. Schon lustig, man findet kaum eine Java-lib ohne java.lang.String aber man findet auch kaum eine C++ - lib mit std::string.
Genau. In C++ Quelltexten findet man meistens const char*
-
Du könntest deine logische Schicht ja auch aus Templates aufbauen:
template <typename StrType> class address { private: StrType m_first_name; StrType m_family_name; //... };
Ist aber IMHO den Aufwand (Templates im Header --> werden mehrmals mitkompiliert) nicht wert.
-
Marc++us schrieb:
kingruedi schrieb:
Wenn jemand in einen basic_string UTF16 reinpackt, ist das imho nicht mehr als ein Hack.
Deckt aber 99% aller praxisrelevanten Fälle ab. Solange length() funktioniert...
Mal im Ernst, einen Hack sehe ich hier nicht. Das <T> steht doch dafür, daß ich hier einen beliebigen Typ reinpacken darf, solange er alle notwendigen Operatoren anbietet. wchar_t erfüllt das durchaus.
basic_string<T> erwartet aber 1 Zeichen = 1 T.
Das wchar_t 2 Byte groß ist stammt noch aus der UCS2 Zeit. Unter Linux hat man zB wchar_t einfach auf 4 Byte umgestellt, entsprechend für UCS4.