gnu c++ locale's unter Windows7


jkallup

Erfahrenes Mitglied
Hallo,

ich programmiere auf verschiedene Systeme und stosse auf ein Problem mit locale's.
Unter windows7 will es mir nicht gelingen:
Unter Windows7 setze ich MinGW gnu c++ 4.7.2 ein, unter Linux gcc 4.7.0

Code:
cout << "german" << endl;
std::locale loc("German_Germany.1252");
Diies ist die Message auf der console, die nach ausf+hrung des obigen codes kommt:

Code:
terminate called after throwing an instance of 'std::runtime_error'
  what():  locale::facet::_S_create_c_locale name not valid
mit de_DE unter Linux funktioniert die Ausführung des Programmes.
unter windows fehlanzeige -> crash :/

Was ist da jetzt los?
 

Cromon

Erfahrenes Mitglied
Hallo jkallup

Die locale names darf jede Implementation selber bestimmen und umsetzen, keine Vorschrift des Standards diesbezüglich (ausser: "C" -> C locale, "" -> default locale).

Verschiedene Auswahlen:
Visual Studio 13: de-DE, German, German_Switzerland, German_Germany.1251, usw
Frühere VS-Versionen: Im jahre 2010 gingen nur die langen Namen, de-DE, de-CH usw gingen nicht
MinGW (gcc auf windows): POSIX, C, alles andere nicht implementiert
gcc auf Linux: Offenbar sicher de_DE, alles andere keine Ahnung (ich nix sprechen Linux)

Beides durchaus valable Umsetzungen der ISO-Standards und auch beide weit verbreitet. Für mich persönlich ist de-DE wesentlich anschaulicher als de_DE.

Viele Grüsse
Cromon
 
Zuletzt bearbeitet:

jkallup

Erfahrenes Mitglied
geht leider immer noch nicht

Code:
#include <iostream>
#include <locale>

int main(void)
{
  std::cout << std::locale().name() << std::endl;
  std::locale::global(std::locale("de-DE"));
/*
Error für letzter Befehl ("de-DE"):

terminate called after throwing an instance of 'std::runtime_error'
  what():  locale::facet::_S_create_c_locale name not valid

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

*/


/*
Windows AppCrashInfos:

Problemsignatur:
  Problemereignisname:	APPCRASH
  Anwendungsname:	ltest.exe
  Anwendungsversion:	0.0.0.0
  Anwendungszeitstempel:	535652d8
  Fehlermodulname:	libstdc++-6.dll         // dies scheint der Übeltätet zu sein :/
  Fehlermodulversion:	0.0.0.0
  Fehlermodulzeitstempel:	507d56df
  Ausnahmecode:	40000015
  Ausnahmeoffset:	0001d454
  Betriebsystemversion:	6.1.7600.2.0.0.768.11
  Gebietsschema-ID:	1031
  Zusatzinformation 1:	5872
  Zusatzinformation 2:	5872435f93d49f43cbc63cf070c66edd
  Zusatzinformation 3:	3b55
  Zusatzinformation 4:	3b551c0a6820a38af30032bed1c9aedd

*/

//  std::cout << std::locale().name() << std::endl;
//  std::locale::global(std::locale("C"));
//  std::cout << std::locale().name() << std::endl;
  return 0;
}
 

Cromon

Erfahrenes Mitglied
Hallo jkallup

Wie erwähnt, das ist komplett davon abhängig welchen Compiler und welche Version davon du verwendest. Für MinGW gilt: Unterstützt wird "POSIX" und "C", alles andere -> nicht implementiert.

Viele Grüsse
Cromon
 

jkallup

Erfahrenes Mitglied
Code:
I:\kbase-bin\5\Neues Verzeichnis\out\new>g++ -v
Es werden eingebaute Spezifikationen verwendet.
COLLECT_GCC=i:\mingw\bin\g++.EXE
COLLECT_LTO_WRAPPER=i:/mingw/bin/../libexec/gcc/mingw32/4.7.2/lto-wrapper.exe
Ziel: mingw32
Konfiguriert mit: ../gcc-4.7.2/configure --enable-languages=c,c++,ada,fortran,objc,obj-c++ --disable
-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgomp --disable-win32-registry --enable-li
bstdcxx-debug --disable-build-poststage1-with-cxx --enable-version-specific-runtime-libs --build=min
gw32 --prefix=/mingw
Thread-Modell: win32
gcc-Version 4.7.2 (GCC)

I:\kbase-bin\5\Neues Verzeichnis\out\new>
muss ich irgendwas als Env.Variable in der Console setzen?
klappt aber leider alles leider nicht

hab ich nen trojaner auf dem computer, der die locale abfängt?
 

jkallup

Erfahrenes Mitglied
danke für Deine Antworten,
der folgende code funktioniert nun:

Code:
std::transform(s.begin(), s.end(), s.begin(), std::bind(std::toupper<char>, std::placeholders::_1, std::locale()));

alles schon merkwürdig unter Windows.
vielleicht sollte ich alles gleich nur noch unter Linux machen.

Gruß
 

Cromon

Erfahrenes Mitglied
Hallo jkallup

Ich darf mich noch mehrmals wiederholen:
Das hat NICHTS mit Windows zu tun, sondern mit dem Compiler den du verwendest. Windows unterstützt alle gängigen locales, es hat sie einfach niemand in libstdc++ eingebaut, verständlich, wer verwendet schon freiwillig nen Billigwagen, wenn er einen Ferrari haben kann (ausser aus Kostengründen)?

Natürlich funktioniert der Code, den du gepostet hast, er verwendet ja auch das default locale, welches der Standard zwingend implementiert haben will (neben dem C-locale).

Deine Logik 'alles schon merkwürdig unter Windows.' ist etwa wie: alles schon merkwürdig auf Linux, unterstützt nicht mal C++-AMP (offener Standard für GPU parallelisierten Code, der aktuell nur in VS umgesetzt ist).

Viele Grüsse
Cromon
 

Neue Beiträge