R
Ralf Goertz
Hi,
consider the following program loc.cc
#include <iostream>
#include <fstream>
#include <string>
#include <locale>
using namespace std;
int main(){
char *l=setlocale(LC_ALL,"de_DE.UTF-8");
if (!l) {cerr<<"locale problem"<<endl; return 1;}
wstring w;
wcin>>w;
wostream &outf=wcout; // (*) works
// wofstream outf("xx"); // (**) doesn't work
outf<<w<<L" "<<w.size()<<endl;
return 0;
}
If the program is called with
loc <infile
where infile contains the the UTF-8 encoded line
"The_german_word_for_apples_is_Äpfel"
I get the output
"The_german_word_for_apples_is_Äpfel 35"
However, if the line (*) is commented out and instead the line (**) is
used the file xx is empty. This can be fixed by
outf.imbue(locale("de_DE.UTF-8"));
after the the declaration of outf and before outputting the string. On
the other hand omitting the "setlocale" call and instead imbuing wcin
with the locale directly yields
"The_german_word_for_apples_is_ 30"
This seems a little odd. Does that mean wcin and wcout are locale-aware
after a setlocale call whereas "ordinary" files need an imbue call? If
so why?
consider the following program loc.cc
#include <iostream>
#include <fstream>
#include <string>
#include <locale>
using namespace std;
int main(){
char *l=setlocale(LC_ALL,"de_DE.UTF-8");
if (!l) {cerr<<"locale problem"<<endl; return 1;}
wstring w;
wcin>>w;
wostream &outf=wcout; // (*) works
// wofstream outf("xx"); // (**) doesn't work
outf<<w<<L" "<<w.size()<<endl;
return 0;
}
If the program is called with
loc <infile
where infile contains the the UTF-8 encoded line
"The_german_word_for_apples_is_Äpfel"
I get the output
"The_german_word_for_apples_is_Äpfel 35"
However, if the line (*) is commented out and instead the line (**) is
used the file xx is empty. This can be fixed by
outf.imbue(locale("de_DE.UTF-8"));
after the the declaration of outf and before outputting the string. On
the other hand omitting the "setlocale" call and instead imbuing wcin
with the locale directly yields
"The_german_word_for_apples_is_ 30"
This seems a little odd. Does that mean wcin and wcout are locale-aware
after a setlocale call whereas "ordinary" files need an imbue call? If
so why?