std::locale ctor fails (L10n with C++)

S

Sashi Asokarajan

Hello,

recently I stepped over Strotrup's TC++PL (third ed.) Chapter D.1
where the localization support of the C++ stdlib is explained.
[ http://www.research.att.com/~bs/3rd_loc.pdf ]

Unfortunately the constructor fails if I try to instantiate std::locale
for locales other than C or POSIX.
With (only) LANG="de.DE.UTF-8" set in ENV the following code thows an exception:
std::locale loc("");

and std::setlocale(LC_ALL, ""); works fine?!

My GCC Version is "gcc (GCC) 3.4.6 [FreeBSD] 20060305" and I'm
using FreeBSD 6.2.

Here's my example code:

#include <clocale>
#include <iostream>

int main()
{
using std::cout;
using std::endl;

const char* const lstr = std::setlocale(LC_ALL, "");

if (lstr)
cout << "lstr=" << lstr << endl;
else
cout << "lstr=NULL" << endl;

std::locale loc("");
cout << "std::locale loc=" << loc.name() << endl;
}

Output:
lstr=de_DE.UTF-8
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid
Abort (core dumped)

Does anyone have similar problems ? What am I doing wrong ?
Is the libstdc++ incomplete on my platform?

Sashi
 
E

Erik Wikström

Hello,

recently I stepped over Strotrup's TC++PL (third ed.) Chapter D.1
where the localization support of the C++ stdlib is explained.
[ http://www.research.att.com/~bs/3rd_loc.pdf ]

Unfortunately the constructor fails if I try to instantiate std::locale
for locales other than C or POSIX.
With (only) LANG="de.DE.UTF-8" set in ENV the following code thows an exception:
std::locale loc("");

and std::setlocale(LC_ALL, ""); works fine?!

My GCC Version is "gcc (GCC) 3.4.6 [FreeBSD] 20060305" and I'm
using FreeBSD 6.2.

Here's my example code:

#include <clocale>
#include <iostream>

int main()
{
using std::cout;
using std::endl;

const char* const lstr = std::setlocale(LC_ALL, "");

if (lstr)
cout << "lstr=" << lstr << endl;
else
cout << "lstr=NULL" << endl;

std::locale loc("");
cout << "std::locale loc=" << loc.name() << endl;
}

Output:
lstr=de_DE.UTF-8
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid
Abort (core dumped)

Does anyone have similar problems ? What am I doing wrong ?
Is the libstdc++ incomplete on my platform?

The code works for me using VS2005, it is probably a problem with (your
version of) libstdc++.
 
M

Maarten Kronenburg

"Sashi Asokarajan" wrote in message
Hello,

recently I stepped over Strotrup's TC++PL (third ed.) Chapter D.1
where the localization support of the C++ stdlib is explained.
[ http://www.research.att.com/~bs/3rd_loc.pdf ]

Unfortunately the constructor fails if I try to instantiate std::locale
for locales other than C or POSIX.
With (only) LANG="de.DE.UTF-8" set in ENV the following code thows an exception:
std::locale loc("");

and std::setlocale(LC_ALL, ""); works fine?!

My GCC Version is "gcc (GCC) 3.4.6 [FreeBSD] 20060305" and I'm
using FreeBSD 6.2.

Here's my example code:

#include <clocale>

Should you be using:
 
S

Sashi Asokarajan

Maarten said:
Should you be using:
#include <locale>
for C++ locale?
yes, you're right. it seems to be already included in some
of the iostream headers, that's why I didn't get any errors.
I prefixed std:: before locale anyway. for completeness I included <locale> and
it still keeps aborting.

while googling, I found out, that OS X users have the same problem?!
probably it's platform specific issue.

thanks for your reply.


sashi
 
J

James Kanze

recently I stepped over Strotrup's TC++PL (third ed.) Chapter D.1
where the localization support of the C++ stdlib is explained.
[http://www.research.att.com/~bs/3rd_loc.pdf]
Unfortunately the constructor fails if I try to instantiate
std::locale for locales other than C or POSIX.

Are they installed correctly? There's no guarantee that other
locales are available. (For that matter, there's no guarantee
that POSIX locale is available unless you're on a Posix system.)
With (only)
LANG="de.DE.UTF-8" set in ENV the following code thows an
exception: std::locale loc("");
and std::setlocale(LC_ALL, ""); works fine?!

My GCC Version is "gcc (GCC) 3.4.6 [FreeBSD] 20060305" and I'm
using FreeBSD 6.2.

Here's my example code:

#include <clocale>
#include <iostream>

int main()
{
using std::cout;
using std::endl;

const char* const lstr = std::setlocale(LC_ALL, "");

if (lstr)
cout << "lstr=" << lstr << endl;
else
cout << "lstr=NULL" << endl;

std::locale loc("");
cout << "std::locale loc=" << loc.name() << endl;

}

Output:
lstr=de_DE.UTF-8
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid
Abort (core dumped)
Does anyone have similar problems ? What am I doing wrong ?
Is the libstdc++ incomplete on my platform?

I *think* that the libstdc++ bases itself on the installed
system locales, but I'm not at all sure how. Under SuSE Linux,
with g++ 4.2.1, if I set LANG to "de_DE.UTF-8", it works for me.
(Note that it didn't work with older versions of g++. I don't
know when it started working, however, although I thought it was
before 4.0. Maybe all you need to do is upgrade.)
 
S

Sashi Asokarajan

James said:
I *think* that the libstdc++ bases itself on the installed
system locales, but I'm not at all sure how. Under SuSE Linux,
with g++ 4.2.1, if I set LANG to "de_DE.UTF-8", it works for me.
(Note that it didn't work with older versions of g++. I don't
know when it started working, however, although I thought it was
before 4.0. Maybe all you need to do is upgrade.)
Cool, thanks. I'll go for the upgrade.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,066
Latest member
VytoKetoReviews

Latest Threads

Top