diff --git a/src/xercesc/util/Transcoders/IconvFBSD/IconvFBSDTransService.cpp b/src/xercesc/util/Transcoders/IconvFBSD/IconvFBSDTransService.cpp
index a5ecdbbfb27b866d7971f07aceeb564e27853f3d..e54e976f2b8f2532cd6d96cf7d1649c2f469493c 100644
--- a/src/xercesc/util/Transcoders/IconvFBSD/IconvFBSDTransService.cpp
+++ b/src/xercesc/util/Transcoders/IconvFBSD/IconvFBSDTransService.cpp
@@ -509,9 +509,26 @@ IconvFBSDTransService::IconvFBSDTransService()
     }
 #endif
 
-    // Try to obtain local (host) characterset through the environment
-    char*    fLocalCP = setlocale (LC_CTYPE, "");
-    if (fLocalCP == NULL)
+    // Try to obtain local (host) characterset from the setlocale
+    // and through the environment. Do not call setlocale(LC_*, "")!
+    // Using an empty string instead of NULL, will modify the libc
+    // behavior.
+    //
+    char* fLocalCP = setlocale (LC_CTYPE, NULL);
+    if (fLocalCP == NULL || *fLocalCP == 0 ||
+        strcmp (fLocalCP, "C") == 0 ||
+        strcmp (fLocalCP, "POSIX") == 0) {
+      fLocalCP = getenv ("LC_ALL");
+      if (fLocalCP == NULL) {
+        fLocalCP = getenv ("LC_CTYPE");
+        if (fLocalCP == NULL)
+          fLocalCP = getenv ("LANG");
+      }
+    }
+
+    if (fLocalCP == NULL || *fLocalCP == 0 ||
+        strcmp (fLocalCP, "C") == 0 ||
+        strcmp (fLocalCP, "POSIX") == 0)
         fLocalCP = "iso-8859-1";    // fallback locale
     else {
         char    *ptr = strchr (fLocalCP, '.');
diff --git a/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp b/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp
index 302429fdef5c2e5e23ceb216b8ea36e41ddfedb6..37faba188cce9c3b5541b830318a622f4dcd853f 100644
--- a/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp
+++ b/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp
@@ -417,9 +417,26 @@ IconvGNUTransService::IconvGNUTransService()
     }
 #endif
 
-    // Try to obtain local (host) characterset through the environment
-    char*    fLocalCP = setlocale (LC_CTYPE, "");
-    if (fLocalCP == NULL)
+    // Try to obtain local (host) characterset from the setlocale
+    // and through the environment. Do not call setlocale(LC_*, "")!
+    // Using an empty string instead of NULL, will modify the libc
+    // behavior.
+    //
+    char* fLocalCP = setlocale (LC_CTYPE, NULL);
+    if (fLocalCP == NULL || *fLocalCP == 0 ||
+        strcmp (fLocalCP, "C") == 0 ||
+        strcmp (fLocalCP, "POSIX") == 0) {
+      fLocalCP = getenv ("LC_ALL");
+      if (fLocalCP == NULL) {
+        fLocalCP = getenv ("LC_CTYPE");
+        if (fLocalCP == NULL)
+          fLocalCP = getenv ("LANG");
+      }
+    }
+
+    if (fLocalCP == NULL || *fLocalCP == 0 ||
+        strcmp (fLocalCP, "C") == 0 ||
+        strcmp (fLocalCP, "POSIX") == 0)
         fLocalCP = "iso-8859-1";    // fallback locale
     else {
         char    *ptr = strchr (fLocalCP, '.');