0

I'm trying to read a text through the command line, and then integrate its words into a map. The text contains commas, parentheses, etc., and also German letters such as ä, ö, ü, etc. I managed to remove all the punctuation and special characters, but I'm having trouble with the umlauts. Also, words like "don't" should be treated as two separate words, "don" and "t". Do you know how I can solve this problem in my code?

#include <iostream>
#include <fstream>
#include <string>
#include <map>
#include <cctype>
#include <algorithm>
#include <vector>

using namespace std;

bool compare(const pair<string, int>& a, const pair<string, int>& b) {
    if (a.second == b.second) {
        return a.first < b.first;
    }
    return a.second > b.second;
}

int main(int argc, char* argv[]) {
    // Check if filename is provided and if not give error message
    if (argc < 2) {
        cerr << "Error: filename not provided." << endl;
        return 1;
    }

    // Check for option flags
    bool ignoreCase = false;
    bool printList = false;
    for (int i = 2; i < argc; i++) {
        if (strcmp(argv[i], "-I") == 0) {
            ignoreCase = true;
        }
        if (strcmp(argv[i], "-l") == 0) {
            printList = true;
        }
    }

    // Open input file and if not give error message
    ifstream inFile(argv[1]);
    if (!inFile) {
        cerr << "Error: could not open file with name " << argv[1] << "." << endl;
        return 1;
    }

    // Read file and create a map
    map<string, int> word_count;
    string word;
    while (inFile >> word) {
        cout << word;
        // remove punctuation and special characters
        word.erase(remove_if(word.begin(), word.end(), [](char c) { return !isalpha(c) && !isdigit(c); }), word.end());
        // Convert to lowercase if option flag is set
        if (ignoreCase == true) {
            transform(word.begin(), word.end(), word.begin(), [](unsigned char c) { return tolower(c); });
        }
        // add word to map and increment count
        ++word_count[word];
    }


    // Get the inputfile name and find the position of the last dot in the input file name
    string inputFile = argv[1];
    size_t dotPos = inputFile.rfind('.');
    if (dotPos != string::npos) {
        // Remove everything after the last dot
        inputFile.erase(dotPos);
    }

    // Print the word count to console and output file
    string outFilename = "a01508252-" + inputFile + ".out";
    ofstream outFile(outFilename);

    if (printList == false) {
        int totalValues = 0;
        for (const auto& pair : word_count) {
            cout << pair.first << ": " << pair.second << endl;
            totalValues += pair.second;
        }
        outFile << word_count.size() << " / " << totalValues << endl;
    } else { // print word count

        vector<pair<string, int>> sorted_word_count(word_count.begin(), word_count.end());
        sort(sorted_word_count.begin(), sorted_word_count.end(), compare);

        for (const auto& pair : sorted_word_count) {

            cout << pair.first << "\t" << pair.second << endl;
            outFile << pair.first << "\t" << pair.second << endl;
        }
    }
    outFile.close();

    return 0;
}

The file I want to read in is

Die Bürgschaft

Friedrich von Schiller


Zu Dionys, dem Tyrannen, schlich
Damon, den Dolch im Gewande:
Ihn schlugen die Häscher in Bande,
"Was wolltest du mit dem Dolche? sprich!"
Entgegnet ihm finster der Wüterich.
"Die Stadt vom Tyrannen befreien!"
"Das sollst du am Kreuze bereuen."

"Ich bin", spricht jener, "zu sterben bereit
Und bitte nicht um mein Leben:
Doch willst du Gnade mir geben,
Ich flehe dich um drei Tage Zeit,
Bis ich die Schwester dem Gatten gefreit;
Ich lasse den Freund dir als Bürgen,
Ihn magst du, entrinn' ich, erwürgen."

Da lächelt der König mit arger List
Und spricht nach kurzem Bedenken:
"Drei Tage will ich dir schenken;
Doch wisse, wenn sie verstrichen, die Frist,
Eh' du zurück mir gegeben bist,
So muß er statt deiner erblassen,
Doch dir ist die Strafe erlassen."

Und er kommt zum Freunde: "Der König gebeut,
Daß ich am Kreuz mit dem Leben
Bezahle das frevelnde Streben.
Doch will er mir gönnen drei Tage Zeit,
Bis ich die Schwester dem Gatten gefreit;
So bleib du dem König zum Pfande,
Bis ich komme zu lösen die Bande."

Und schweigend umarmt ihn der treue Freund
Und liefert sich aus dem Tyrannen;
Der andere ziehet von dannen.
Und ehe das dritte Morgenrot scheint,
Hat er schnell mit dem Gatten die Schwester vereint,
Eilt heim mit sorgender Seele,
Damit er die Frist nicht verfehle.

Da gießt unendlicher Regen herab,
Von den Bergen stürzen die Quellen,
Und die Bäche, die Ströme schwellen.
Und er kommt ans Ufer mit wanderndem Stab,
Da reißet die Brücke der Strudel hinab,
Und donnernd sprengen die Wogen
Des Gewölbes krachenden Bogen.

Und trostlos irrt er an Ufers Rand:
Wie weit er auch spähet und blicket
Und die Stimme, die rufende, schicket.
Da stößet kein Nachen vom sichern Strand,
Der ihn setze an das gewünschte Land,
Kein Schiffer lenket die Fähre,
Und der wilde Strom wird zum Meere.

Da sinkt er ans Ufer und weint und fleht,
Die Hände zum Zeus erhoben:
"O hemme des Stromes Toben!
Es eilen die Stunden, im Mittag steht
Die Sonne, und wenn sie niedergeht
Und ich kann die Stadt nicht erreichen,
So muß der Freund mir erbleichen."

Doch wachsend erneut sich des Stromes Wut,
Und Welle auf Welle zerrinnet,
Und Stunde an Stunde entrinnet.
Da treibt ihn die Angst, da faßt er sich Mut
Und wirft sich hinein in die brausende Flut
Und teilt mit gewaltigen Armen
Den Strom, und ein Gott hat Erbarmen.

Und gewinnt das Ufer und eilet fort
Und danket dem rettenden Gotte;
Da stürzet die raubende Rotte
Hervor aus des Waldes nächtlichem Ort,
Den Pfad ihm sperrend, und schnaubet Mord
Und hemmet des Wanderers Eile
Mit drohend geschwungener Keule.

"Was wollt ihr?" ruft er vor Schrecken bleich,
"Ich habe nichts als mein Leben,
Das muß ich dem Könige geben!"
Und entreißt die Keule dem nächsten gleich:
"Um des Freundes willen erbarmet euch!"
Und drei mit gewaltigen Streichen
Erlegt er, die andern entweichen.

Und die Sonne versendet glühenden Brand,
Und von der unendlichen Mühe
Ermattet sinken die Kniee.
"O hast du mich gnädig aus Räubershand,
Aus dem Strom mich gerettet ans heilige Land,
Und soll hier verschmachtend verderben,
Und der Freund mir, der liebende, sterben!"

Und horch! da sprudelt es silberhell,
Ganz nahe, wie rieselndes Rauschen,
Und stille hält er, zu lauschen;
Und sieh, aus dem Felsen, geschwätzig, schnell,
Springt murmelnd hervor ein lebendiger Quell,
Und freudig bückt er sich nieder
Und erfrischet die brennenden Glieder.

Und die Sonne blickt durch der Zweige Grün
Und malt auf den glänzenden Matten
Der Bäume gigantische Schatten;
Und zwei Wanderer sieht er die Straße ziehn,
Will eilenden Laufes vorüber fliehn,
Da hört er die Worte sie sagen:
"Jetzt wird er ans Kreuz geschlagen."

Und die Angst beflügelt den eilenden Fuß,
Ihn jagen der Sorge Qualen;
Da schimmern in Abendrots Strahlen
Von ferne die Zinnen von Syrakus,
Und entgegen kommt ihm Philostratus,
Des Hauses redlicher Hüter,
Der erkennet entsetzt den Gebieter:

"Zurück! du rettest den Freund nicht mehr,
So rette das eigene Leben!
Den Tod erleidet er eben.
Von Stunde zu Stunde gewartet' er
Mit hoffender Seele der Wiederkehr,
Ihm konnte den mutigen Glauben
Der Hohn des Tyrannen nicht rauben."

"Und ist es zu spät, und kann ich ihm nicht,
Ein Retter, willkommen erscheinen,
So soll mich der Tod ihm vereinen.
Des rühme der blut'ge Tyrann sich nicht,
Daß der Freund dem Freunde gebrochen die Pflicht,
Er schlachte der Opfer zweie
Und glaube an Liebe und Treue!"

Und die Sonne geht unter, da steht er am Tor,
Und sieht das Kreuz schon erhöhet,
Das die Menge gaffend umstehet;
An dem Seile schon zieht man den Freund empor,
Da zertrennt er gewaltig den dichten Chor:
"Mich, Henker", ruft er, "erwürget!
Da bin ich, für den er gebürget!"

Und Erstaunen ergreifet das Volk umher,
In den Armen liegen sich beide
Und weinen vor Schmerzen und Freude.
Da sieht man kein Auge tränenleer,
Und zum Könige bringt man die Wundermär';
Der fühlt ein menschliches Rühren,
Läßt schnell vor den Thron sie führen,

Und blicket sie lange verwundert an.
Drauf spricht er: "Es ist euch gelungen,
Ihr habt das Herz mir bezwungen;
Und die Treue, sie ist doch kein leerer Wahn -
So nehmet auch mich zum Genossen an:
Ich sei, gewährt mir die Bitte,
In eurem Bunde der Dritte!"

The output I get:

und 55
die 41
er  25
der 24
da  17
den 16
dem 15
ich 15
das 11
mit 10
des 9
du  8
an  7
freund  7
mir 7
nicht   7
sich    7
von 7
doch    6
ihm 6
ihn 6
sie 6
so  6
zu  6
zum 6
aus 5
in  5
mich    5
ans 4
drei    4
ein 4
es  4
ist 4
kein    4
leben   4
sonne   4
stunde  4
tyrannen    4
am  3
bis 3
dir 3
gatten  3
knig    3
kommt   3
kreuz   3
man 3
mu  3
schnell 3
schwester   3
sieht   3
spricht 3
strom   3
tage    3
treue   3
ufer    3
um  3
vor 3
will    3
als 2
angst   2
armen   2
auch    2
auf 2
bande   2
bin 2
bitte   2
blicket 2
dritte  2
eilenden    2
euch    2
freunde 2
frist   2
geben   2
gefreit 2
gewaltigen  2
hat 2
hervor  2
ihr 2
im  2
kann    2
keule   2
knige   2
land    2
mein    2
o   2
ruft    2
schon   2
seele   2
soll    2
stadt   2
steht   2
sterben 2
stromes 2
tod 2
vom 2
was 2
welle   2
wenn    2
wie 2
wird    2
zeit    2
zurck   2
    1
abendrots   1
andere  1
andern  1
arger   1
auge    1
bche    1
bckt    1
bedenken    1
beflgelt    1
befreien    1
beide   1
bereit  1
bereuen 1
bergen  1
bezahle 1
bezwungen   1
bist    1
bleib   1
bleich  1
blickt  1
blutge  1
bogen   1
brand   1
brausende   1
brcke   1
brennenden  1
brgen   1
brgschaft   1
bringt  1
bume    1
bunde   1
chor    1
damit   1
damon   1
danket  1
dannen  1
deiner  1
dich    1
dichten 1
dionys  1
dolch   1
dolche  1
donnernd    1
drauf   1
drohend 1
durch   1
eben    1
eh  1
ehe 1
eigene  1
eile    1
eilen   1
eilet   1
eilt    1
empor   1
entgegen    1
entgegnet   1
entreit 1
entrinn 1
entrinnet   1
entsetzt    1
entweichen  1
erbarmen    1
erbarmet    1
erblassen   1
erbleichen  1
erfrischet  1
ergreifet   1
erhhet  1
erhoben 1
erkennet    1
erlassen    1
erlegt  1
erleidet    1
ermattet    1
erneut  1
erreichen   1
erscheinen  1
erstaunen   1
erwrgen 1
erwrget 1
eurem   1
fat 1
felsen  1
ferne   1
fhlt    1
fhre    1
fhren   1
finster 1
flehe   1
fleht   1
fliehn  1
flut    1
fort    1
fr  1
freude  1
freudig 1
freundes    1
frevelnde   1
friedrich   1
fu  1
gaffend 1
ganz    1
gebeut  1
gebieter    1
gebrget 1
gebrochen   1
gegeben 1
geht    1
gelungen    1
genossen    1
gerettet    1
geschlagen  1
geschwtzig  1
geschwungener   1
gewaltig    1
gewande 1
gewartet    1
gewhrt  1
gewinnt 1
gewlbes 1
gewnschte   1
giet    1
gigantische 1
glaube  1
glauben 1
gleich  1
glhenden    1
glieder 1
glnzenden   1
gnade   1
gndig   1
gnnen   1
gott    1
gotte   1
grn 1
habe    1
habt    1
hast    1
hauses  1
heilige 1
heim    1
hemme   1
hemmet  1
henker  1
herab   1
herz    1
hier    1
hinab   1
hinein  1
hlt 1
hnde    1
hoffender   1
hohn    1
horch   1
hrt 1
hscher  1
hter    1
irrt    1
jagen   1
jener   1
jetzt   1
kniee   1
komme   1
konnte  1
krachenden  1
kreuze  1
kurzem  1
lange   1
lasse   1
laufes  1
lauschen    1
lchelt  1
lebendiger  1
leerer  1
lenket  1
liebe   1
liebende    1
liefert 1
liegen  1
list    1
lsen    1
lt  1
magst   1
malt    1
matten  1
meere   1
mehr    1
menge   1
menschliches    1
mhe 1
mittag  1
mord    1
morgenrot   1
murmelnd    1
mut 1
mutigen 1
nach    1
nachen  1
nahe    1
nchsten 1
nchtlichem  1
nehmet  1
nichts  1
nieder  1
niedergeht  1
opfer   1
ort 1
pfad    1
pfande  1
pflicht 1
philostratus    1
qualen  1
quell   1
quellen 1
rand    1
rauben  1
raubende    1
rauschen    1
redlicher   1
regen   1
reiet   1
rette   1
rettenden   1
retter  1
rettest 1
rhme    1
rhren   1
rieselndes  1
rotte   1
rubershand  1
rufende 1
sagen   1
schatten    1
scheint 1
schenken    1
schicket    1
schiffer    1
schiller    1
schimmern   1
schlachte   1
schlich 1
schlugen    1
schmerzen   1
schnaubet   1
schrecken   1
schweigend  1
schwellen   1
sei 1
seile   1
setze   1
sichern 1
sieh    1
silberhell  1
sinken  1
sinkt   1
sollst  1
sorge   1
sorgender   1
sperrend    1
sphet   1
sprengen    1
sprich  1
springt 1
sprudelt    1
spt 1
stab    1
statt   1
stet    1
stille  1
stimme  1
strae   1
strafe  1
strahlen    1
strand  1
streben 1
streichen   1
strme   1
strudel 1
strzen  1
strzet  1
stunden 1
syrakus 1
teilt   1
thron   1
toben   1
tor 1
treibt  1
trnenleer   1
trostlos    1
tyrann  1
ufers   1
umarmt  1
umher   1
umstehet    1
unendlichen 1
unendlicher 1
unter   1
verderben   1
vereinen    1
vereint 1
verfehle    1
verschmachtend  1
versendet   1
verstrichen 1
verwundert  1
volk    1
vorber  1
wachsend    1
wahn    1
waldes  1
wanderer    1
wanderers   1
wanderndem  1
weinen  1
weint   1
weit    1
wiederkehr  1
wilde   1
willen  1
willkommen  1
willst  1
wirft   1
wisse   1
wogen   1
wollt   1
wolltest    1
worte   1
wterich 1
wundermr    1
wut 1
zerrinnet   1
zertrennt   1
zeus    1
ziehet  1
ziehn   1
zieht   1
zinnen  1
zwei    1
zweie   1
zweige  1

What I should get out

und 55
die 41
er  25
der 24
den 16
da  15
dem 15
ich 15
das 11
mit 10
des 9
du  8
an  7
freund  7
mir 7
nicht   7
sich    7
von 7
doch    6
ihm 6
ihn 6
sie 6
so  6
zu  6
zum 6
aus 5
in  5
mich    5
ans 4
drei    4
ein 4
es  4
ist 4
kein    4
leben   4
sonne   4
stunde  4
tyrannen    4
am  3
bis 3
dir 3
gatten  3
kommt   3
kreuz   3
könig   3
man 3
muß 3
schnell 3
schwester   3
sieht   3
spricht 3
strom   3
tage    3
treue   3
ufer    3
um  3
vor 3
will    3
als 2
angst   2
armen   2
auch    2
auf 2
bande   2
bin 2
bitte   2
blicket 2
daß 2
dritte  2
eilenden    2
euch    2
freunde 2
frist   2
geben   2
gefreit 2
gewaltigen  2
hat 2
hervor  2
ihr 2
im  2
kann    2
keule   2
könige  2
land    2
mein    2
o   2
ruft    2
schon   2
seele   2
soll    2
stadt   2
steht   2
sterben 2
stromes 2
tod 2
vom 2
was 2
welle   2
wenn    2
wie 2
wird    2
zeit    2
zurück  2
abendrots   1
andere  1
andern  1
arger   1
auge    1
bedenken    1
beflügelt   1
befreien    1
beide   1
bereit  1
bereuen 1
bergen  1
bezahle 1
bezwungen   1
bist    1
bleib   1
bleich  1
blickt  1
blut    1
bogen   1
brand   1
brausende   1
brennenden  1
bringt  1
brücke  1
bunde   1
bäche   1
bäume   1
bückt   1
bürgen  1
bürgschaft  1
chor    1
damit   1
damon   1
danket  1
dannen  1
deiner  1
dich    1
dichten 1
dionys  1
dolch   1
dolche  1
donnernd    1
drauf   1
drohend 1
durch   1
eben    1
eh  1
ehe 1
eigene  1
eile    1
eilen   1
eilet   1
eilt    1
empor   1
entgegen    1
entgegnet   1
entreißt    1
entrinn 1
entrinnet   1
entsetzt    1
entweichen  1
erbarmen    1
erbarmet    1
erblassen   1
erbleichen  1
erfrischet  1
ergreifet   1
erhoben 1
erhöhet 1
erkennet    1
erlassen    1
erlegt  1
erleidet    1
ermattet    1
erneut  1
erreichen   1
erscheinen  1
erstaunen   1
erwürgen    1
erwürget    1
eurem   1
faßt    1
felsen  1
ferne   1
finster 1
flehe   1
fleht   1
fliehn  1
flut    1
fort    1
freude  1
freudig 1
freundes    1
frevelnde   1
friedrich   1
fuß 1
fähre   1
fühlt   1
führen  1
für 1
gaffend 1
ganz    1
ge  1
gebeut  1
gebieter    1
gebrochen   1
gebürget    1
gegeben 1
geht    1
gelungen    1
genossen    1
gerettet    1
geschlagen  1
geschwungener   1
geschwätzig 1
gewaltig    1
gewande 1
gewartet    1
gewinnt 1
gewährt 1
gewölbes    1
gewünschte  1
gießt   1
gigantische 1
glaube  1
glauben 1
gleich  1
glieder 1
glänzenden  1
glühenden   1
gnade   1
gnädig  1
gott    1
gotte   1
grün    1
gönnen  1
habe    1
habt    1
hast    1
hauses  1
heilige 1
heim    1
hemme   1
hemmet  1
henker  1
herab   1
herz    1
hier    1
hinab   1
hinein  1
hoffender   1
hohn    1
horch   1
hält    1
hände   1
häscher 1
hört    1
hüter   1
irrt    1
jagen   1
jener   1
jetzt   1
kniee   1
komme   1
konnte  1
krachenden  1
kreuze  1
kurzem  1
lange   1
lasse   1
laufes  1
lauschen    1
lebendiger  1
leerer  1
lenket  1
liebe   1
liebende    1
liefert 1
liegen  1
list    1
lächelt 1
läßt    1
lösen   1
magst   1
malt    1
matten  1
meere   1
mehr    1
menge   1
menschliches    1
mittag  1
mord    1
morgenrot   1
murmelnd    1
mut 1
mutigen 1
mühe    1
nach    1
nachen  1
nahe    1
nehmet  1
nichts  1
nieder  1
niedergeht  1
nächsten    1
nächtlichem 1
opfer   1
ort 1
pfad    1
pfande  1
pflicht 1
philostratus    1
qualen  1
quell   1
quellen 1
rand    1
rauben  1
raubende    1
rauschen    1
redlicher   1
regen   1
reißet  1
rette   1
rettenden   1
retter  1
rettest 1
rieselndes  1
rotte   1
rufende 1
räubershand 1
rühme   1
rühren  1
sagen   1
schatten    1
scheint 1
schenken    1
schicket    1
schiffer    1
schiller    1
schimmern   1
schlachte   1
schlich 1
schlugen    1
schmerzen   1
schnaubet   1
schrecken   1
schweigend  1
schwellen   1
sei 1
seile   1
setze   1
sichern 1
sieh    1
silberhell  1
sinken  1
sinkt   1
sollst  1
sorge   1
sorgender   1
sperrend    1
sprengen    1
sprich  1
springt 1
sprudelt    1
spähet  1
spät    1
stab    1
statt   1
stille  1
stimme  1
strafe  1
strahlen    1
strand  1
straße  1
streben 1
streichen   1
strudel 1
ströme  1
stunden 1
stößet  1
stürzen 1
stürzet 1
syrakus 1
teilt   1
thron   1
toben   1
tor 1
treibt  1
trostlos    1
tränenleer  1
tyrann  1
ufers   1
umarmt  1
umher   1
umstehet    1
unendlichen 1
unendlicher 1
unter   1
verderben   1
vereinen    1
vereint 1
verfehle    1
verschmachtend  1
versendet   1
verstrichen 1
verwundert  1
volk    1
vorüber 1
wachsend    1
wahn    1
waldes  1
wanderer    1
wanderers   1
wanderndem  1
weinen  1
weint   1
weit    1
wiederkehr  1
wilde   1
willen  1
willkommen  1
willst  1
wirft   1
wisse   1
wogen   1
wollt   1
wolltest    1
worte   1
wundermär   1
wut 1
wüterich    1
zerrinnet   1
zertrennt   1
zeus    1
ziehet  1
ziehn   1
zieht   1
zinnen  1
zwei    1
zweie   1
zweige  1
  • What exactly do you consider "_punctuation and special characters_"? What input did you test and what was the (unintended) output? – user17732522 Mar 11 '23 at 15:05
  • "_but I'm having trouble with the umlauts_": What should happen with them? – user17732522 Mar 11 '23 at 15:06
  • I've now added the whole code with the input file and what I get out – Yannick Fitch Mar 11 '23 at 15:11
  • C++ has no support for UTF-8. That does not mean it cannot be done just that you won't get support from the C++ language. However given the text you have shown it's not clear that you need UTF-8. UTF-8 is not the only way to deal with non-ASCII text. – john Mar 11 '23 at 15:12
  • `isalpha` depends on the currently set C locale. In the default "C" locale it will only consider a-Z as matching and `isdigit` considers only 0-9 as matching. Even if you set a UTF-8 locale, they won't work, because they operate per code unit, not code point. (It may or may not possible that your C++ implementation has sufficient support with the wide character variants, e.g. `iswalpha`.) For a simpler approach, exclude only the specific ASCII characters you want to filter in your lambda instead of inverting the test, assuming you want to filter only ASCII characters and that the file is UTF-8 – user17732522 Mar 11 '23 at 15:15
  • So the problem with your code seems to be that the lambda function `[](char c) { return !isalpha(c) && !isdigit(c); }` does not recognise umlauts etc as alphabetic. It will be **much much easier** to fix that function (and stick with whatever encoding you are currently using) instead of switching to UTF-8. – john Mar 11 '23 at 15:16
  • I was trying it with `return !isalpha(c) && !isdigit(c) && c != 'ß' && c != 'ä' && c != 'ü' && c != 'ö' && c != 'Ä' && c != 'Ü' && c != 'Ö';` but I get thousands of error messages then! (`error: character too large for enclosing character literal type `) – Yannick Fitch Mar 11 '23 at 15:24
  • @YannickFitch Instead of saying `c != 'ä'` (which makes assumptions about encoding which maybe not be correct) say `c != xxx` where xxx is the code point in the encoding that you are using for `ä`. – john Mar 11 '23 at 15:26
  • @YannickFitch `std::string` doesn't know anything about unicode and a single `char` represents only a _code unit_, not a character or code point in UTF-8 encoding. You can only invert your test, i.e. test whether a character is inside the set you want to filter, not the other way around. (And this only works because in UTF-8 any ASCII character still has the same value as in ASCII and no other character has a ASCII value.) For example `return c != ' ' && c != '.' && c != ','` and so on. And you must be sure that your file is actually UTF-8 encoded of course, otherwise this may not work either. – user17732522 Mar 11 '23 at 15:27
  • @YannickFitch For example `c != 0xE4` has a fair chance of being correct for `'ä'`, but everything depends on the encoding of your data. – john Mar 11 '23 at 15:30
  • @YannickFitch Really the **first** question you must answer is how is my data encoded. Nothing is doable unless you know that. – john Mar 11 '23 at 15:31
  • the data ist text/plain; charset=utf-8 – Yannick Fitch Mar 11 '23 at 15:32
  • changed it to `[](unsigned char c) { return !isalpha(c) && !(c == 0xE4) && !(c == 0xF6) && !(c == 0xFC); }`but still not working – Yannick Fitch Mar 11 '23 at 15:43
  • @YannickFitch John's suggestion works only if the file is _not_ UTF-8 encoded, but encoded as something common for non-unicode german, e.g. ISO 8859-1. For UTF-8 you fundamentally can't check non-ASCII characters by checking with `==` on individual `char`. – user17732522 Mar 11 '23 at 15:55

0 Answers0