+// ----------------------------------------------------------------------------
+// encoding stuff
+// ----------------------------------------------------------------------------
+
+// this is a bit strange as under Windows we get the encoding name using its
+// numeric value and under Unix we do it the other way round, but this just
+// reflects the way different systems provide he encoding info
+
+/* static */
+wxString wxLocale::GetSystemEncodingName()
+{
+ wxString encname;
+
+#if defined(__WIN32__) && !defined(__WXMICROWIN__)
+ // FIXME: what is the error return value for GetACP()?
+ UINT codepage = ::GetACP();
+ encname.Printf(_T("windows-%u"), codepage);
+#elif defined(__UNIX_LIKE__)
+
+#if defined(HAVE_LANGINFO_H) && defined(CODESET)
+ // GNU libc provides current character set this way (this conforms
+ // to Unix98)
+ char *oldLocale = strdup(setlocale(LC_CTYPE, NULL));
+ setlocale(LC_CTYPE, "");
+ char *alang = nl_langinfo(CODESET);
+ setlocale(LC_CTYPE, oldLocale);
+ free(oldLocale);
+
+ if ( alang )
+ {
+ // 7 bit ASCII encoding has several alternative names which we should
+ // recognize to avoid warnings about unrecognized encoding on each
+ // program startup
+
+ // nl_langinfo() under Solaris returns 646 by default which stands for
+ // ISO-646, i.e. 7 bit ASCII
+ //
+ // and recent glibc call it ANSI_X3.4-1968...
+ if ( strcmp(alang, "646") == 0 ||
+ strcmp(alang, "ANSI_X3.4-1968") == 0 )
+ {
+ encname = _T("US-ASCII");
+ }
+ else
+ {
+ encname = wxConvLibc.cMB2WX(alang);
+ }
+ }
+ else
+#endif // HAVE_LANGINFO_H
+ {
+ // if we can't get at the character set directly, try to see if it's in
+ // the environment variables (in most cases this won't work, but I was
+ // out of ideas)
+ wxChar *lang = wxGetenv(wxT("LC_ALL"));
+ wxChar *dot = lang ? wxStrchr(lang, wxT('.')) : (wxChar *)NULL;
+ if (!dot)
+ {
+ lang = wxGetenv(wxT("LC_CTYPE"));
+ if ( lang )
+ dot = wxStrchr(lang, wxT('.'));
+ }
+ if (!dot)
+ {
+ lang = wxGetenv(wxT("LANG"));
+ if ( lang )
+ dot = wxStrchr(lang, wxT('.'));
+ }
+
+ if ( dot )
+ {
+ encname = dot+1;
+ }
+ }
+#endif // Win32/Unix
+
+ return encname;
+}
+
+/* static */
+wxFontEncoding wxLocale::GetSystemEncoding()
+{
+#if defined(__WIN32__) && !defined(__WXMICROWIN__)
+ UINT codepage = ::GetACP();
+
+ // wxWindows only knows about CP1250-1257, 932, 936, 949, 950
+ if ( codepage >= 1250 && codepage <= 1257 )
+ {
+ return (wxFontEncoding)(wxFONTENCODING_CP1250 + codepage - 1250);
+ }
+
+ if ( codepage == 932 )
+ {
+ return wxFONTENCODING_CP932;
+ }
+
+ if ( codepage == 936 )
+ {
+ return wxFONTENCODING_CP936;
+ }
+
+ if ( codepage == 949 )
+ {
+ return wxFONTENCODING_CP949;
+ }
+
+ if ( codepage == 950 )
+ {
+ return wxFONTENCODING_CP950;
+ }
+#elif defined(__UNIX_LIKE__) && wxUSE_FONTMAP
+ wxString encname = GetSystemEncodingName();
+ if ( !encname.empty() )
+ {
+ wxFontEncoding enc = wxFontMapper::Get()->
+ CharsetToEncoding(encname, FALSE /* not interactive */);
+
+ // this should probably be considered as a bug in CharsetToEncoding():
+ // it shouldn't return wxFONTENCODING_DEFAULT at all - but it does it
+ // for US-ASCII charset
+ //
+ // we, OTOH, definitely shouldn't return it as it doesn't make sense at
+ // all (which encoding is it?)
+ if ( enc != wxFONTENCODING_DEFAULT )
+ {
+ return enc;
+ }
+ //else: return wxFONTENCODING_SYSTEM below
+ }
+#endif // Win32/Unix
+
+ return wxFONTENCODING_SYSTEM;
+}
+