diff -u -r /home/fornwall/lib/android-ndk/sources/android/support/src/locale/setlocale.c ./src/locale/setlocale.c --- /home/fornwall/lib/android-ndk/sources/android/support/src/locale/setlocale.c 2013-07-26 23:37:59.000000000 -0400 +++ ./src/locale/setlocale.c 2015-01-01 17:16:29.488323212 -0500 @@ -25,23 +25,18 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ -#include +#include #include "locale_impl.h" char *setlocale(int category, const char *locale) { - // Sanity check. - if (locale == NULL) { - errno = EINVAL; - return NULL; - } - // Only accept "", "C" or "POSIX", all equivalent on Android. - if (*locale && strcmp(locale, "C") && strcmp(locale, "POSIX")) { - errno = EINVAL; - return NULL; - } + // setlocale(3): "If locale is NULL, the current locale is only queried, not modified." + if (locale == NULL) return "en_US.UTF-8"; + + // Only accept "", "C" or "POSIX", all equivalent on Android, and any locale with UTF-8/UTF8 in it. + if (*locale && strcmp(locale, "C") && strcmp(locale, "POSIX") && strstr(locale, "UTF-8") == 0 && strstr(locale, "UTF8") == 0) return NULL; + // The function returns a char* but the caller is not supposed to // modify it. Just to a type cast. If the caller tries to write to // it, it will simply segfault. - static const char C_LOCALE_SETTING[] = "C"; - return (char*) C_LOCALE_SETTING; + return "en_US.UTF-8"; }