Here is an attempt at a Windows encoding manager. All the non-unix
platforms have stub encoding managers that always return ISO-8859-1
as the native encoding.
My code is an adaption of the unix code so you might want to compare
them.
Andrew Dunbar.
--
http://linguaphile.sourceforge.net
--- src/af/xap/win/xap_Win32EncodingManager.orig.cpp Sat Apr 21 01:24:10 2001
+++ src/af/xap/win/xap_Win32EncodingManager.cpp Tue May 22 19:54:50 2001
@@ -1,11 +1,106 @@
-#include "xap_EncodingManager.h"
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include "ut_assert.h"
+#include "ut_debugmsg.h"
+#include "xap_Win32EncodingManager.h"
+
+// TODO This data is defined in ap_Win32Prefs.cpp
+
+extern char s_ISO3166_2_and_3[1190];
+
+/************************************************************/
XAP_EncodingManager *XAP_EncodingManager::get_instance()
{
if (_instance == 0)
{
- _instance = new XAP_EncodingManager();
+ UT_DEBUGMSG(("Building XAP_EncodingManager\n"));
+ _instance = new XAP_Win32EncodingManager();
_instance->initialize();
+ UT_DEBUGMSG(("XAP_EncodingManager built\n"));
}
+
return _instance;
}
+
+/************************************************************/
+
+XAP_Win32EncodingManager::XAP_Win32EncodingManager()
+{
+}
+
+XAP_Win32EncodingManager::~XAP_Win32EncodingManager() {}
+
+static const char* NativeEncodingName, *LanguageISOName, *LanguageISOTerritory;
+
+const char* XAP_Win32EncodingManager::getNativeEncodingName() const
+{ return NativeEncodingName; };
+
+const char* XAP_Win32EncodingManager::getLanguageISOName() const
+{ return LanguageISOName; };
+
+const char* XAP_Win32EncodingManager::getLanguageISOTerritory() const
+{ return LanguageISOTerritory; };
+
+
+void XAP_Win32EncodingManager::initialize()
+{
+ char szLocaleInfo[64];
+ static char szLanguage[64];
+ static char szTerritory[64];
+ bool bNorwaySpecialCase = false;
+
+ NativeEncodingName = "ISO-8859-1";
+ LanguageISOName = "en";
+ LanguageISOTerritory = NULL;
+
+ // Encoding
+ if
+(GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_IDEFAULTANSICODEPAGE,szLocaleInfo,sizeof(szLocaleInfo)/sizeof(szLocaleInfo[0])))
+ {
+ // Windows Unicode locale?
+ if (!strcmp(szLocaleInfo,"0"))
+ {
+ NativeEncodingName = "UCS-2-INTERNAL"; // As in
+ev_Win32Keyboard.cpp
+ m_bIsUnicodeLocale = true;
+ }
+ else
+ {
+ NativeEncodingName = charsetFromCodepage(atoi(szLocaleInfo));
+ m_bIsUnicodeLocale = false;
+ }
+ }
+
+ // Language
+ if
+(GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_SABBREVLANGNAME,szLanguage,sizeof(szLanguage)/sizeof(szLanguage[0])))
+ {
+ if (!strcmp(szLanguage,"Non")) // Special case: Nynorsk in
+Norway
+ bNorwaySpecialCase = true; // As in
+ap_Win32Prefs.cpp
+
+ szLanguage[0] = tolower(szLanguage[0]);
+ szLanguage[1] = tolower(szLanguage[1]);
+ szLanguage[2] = '\0';
+ LanguageISOName = szLanguage;
+ }
+
+ // Territory
+ if (bNorwaySpecialCase == true) // Special case: Nynorsk in
+Norway
+ LanguageISOTerritory = "NYNORSK"; // As in ap_Win32Prefs.cpp
+ else if
+(GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_SABBREVCTRYNAME,szLocaleInfo,sizeof(szLocaleInfo)/sizeof(szLocaleInfo[0])))
+ {
+ // TODO This code is copied from ap_Win32Prefs.cpp
+ char *psz;
+
+ for (psz = s_ISO3166_2_and_3; *psz != '\0'; psz += 5 )
+ if (!strncmp(&psz[2],szLocaleInfo,3))
+ break;
+
+ strncpy(szTerritory, psz, 2 );
+ szTerritory[2] = '\0';
+ LanguageISOTerritory = szTerritory;
+ }
+
+ XAP_EncodingManager::initialize();
+ describe();
+};
+
+
xap_Win32EncodingManager.h