So, geht doch...
folgende Version zählt nur die Buchstaben a-z, A-Z, äöüß und ÄÖÜẞ, ich hoffe std-konform...
War eine schwere Geburt
Ich hatte bei
locale::global( myLocale );
meine 'myDeLocale' eingesetzt mit dem Ergebnis das es immer einen Programmausstieg ohne Fehler gegeben hat. Ob das normal ist oder am gcc bzw. an der stdlib liegt weiß ich nicht. Hatte dann sämtliche protected-Funktionen der std::ctype mit wcerr implementiert. Ohne Ergebnis.
Bis ich Begriffen hatte das der Ausstieg wohl schon beim wcin kam, ohje
#include <cstdlib> // EXIT_SUCCESS
#include <locale>
#include <string>
#include <iostream>
#include <algorithm>
// Test der Lokalisierung
struct de_wctype : std::ctype< wchar_t >
{
bool do_is(mask m, char_type c) const
{
if ((m & alpha) && ( c == L'ä' || c == L'Ä' || c == L'ö' || c == L'Ö' || c == L'ü' || c == L'Ü' || c == L'ß' || c == L'ẞ' )) {
return true;
}
return ctype::do_is(m, c);
}
};
int main() {
using namespace std;
wcerr << "Locale nach Programmstart: " << locale().name().c_str() << '\n';
auto myLocale = locale(""); // Locale aus den Benutzereinstellung, zumindest unter Linuxt
de_wctype *my_de_wctype = new de_wctype; // Kein leak, siehe http://en.cppreference.com/w/cpp/locale/ctype
// und http://en.cppreference.com/w/cpp/locale/ctype/~ctype
// Test als lokales Objekt ergibt double-free beim beenden...
auto myDeLocale = locale(myLocale, my_de_wctype);
auto &ct = use_facet< ctype < wchar_t > >(myDeLocale);
locale::global( myLocale );
wcerr << "Locale der Benutzereinstellung: " << myLocale.name().c_str() << '\n';
for( wstring text; wcout << "Text eingeben (leere Eingabe zum beenden): ", getline( wcin, text), text != L""; )
{
wcout << L"Der Text enthält "
<< count_if( begin(text), end(text), [&ct](wchar_t zeichen) { return ct.is( ctype_base::alpha, zeichen); } )
<< " Buchstaben\n";
}
return EXIT_SUCCESS;
}
Die Forumssoftware zeigt das große SZ in den Code-Tags nicht richtig an, also bei "|| c == L'& #7838;'" müsste ein großes SZ (ẞ) rein...
Und source ist mit utf-8 gespeichert, evtl. gibt man besser die entsprechenden Unicode-Nummern an...
Ergebnis:
Locale nach Programmstart: C
Locale der Benutzereinstellung: de_DE.UTF-8
Text eingeben (leere Eingabe zum beenden): öäüßÖÄÜẞσ
Der Text enthält 8 Buchstaben
Text eingeben (leere Eingabe zum beenden): JKLÖ
Der Text enthält 4 Buchstaben
Text eingeben (leere Eingabe zum beenden):
Sigma etc. wird nun ignoriert...
Have a nice day!