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, '.');