If setlocale("en_US.UTF-8") succeeds, then don't do the check for UTF-8

locale since if it isn't UTF-8 the system is broken anyway. If it fails,
try "" and check for UTF-8 with nl_langinfo(CODESET) rather than
wcwidth(). Based on a diff from schwarze@, nl_langinfo also suggested by
stsp@.
This commit is contained in:
nicm 2016-03-05 16:08:38 +00:00
parent c38e0a4bbc
commit 0d6de44a37

13
tmux.c
View File

@ -24,6 +24,7 @@
#include <event.h> #include <event.h>
#include <fcntl.h> #include <fcntl.h>
#include <getopt.h> #include <getopt.h>
#include <langinfo.h>
#include <locale.h> #include <locale.h>
#include <paths.h> #include <paths.h>
#include <pwd.h> #include <pwd.h>
@ -188,10 +189,14 @@ main(int argc, char **argv)
const char *s; const char *s;
int opt, flags, keys; int opt, flags, keys;
if (setlocale(LC_CTYPE, "en_US.UTF-8") == NULL) if (setlocale(LC_CTYPE, "en_US.UTF-8") == NULL) {
setlocale(LC_CTYPE, ""); if (setlocale(LC_CTYPE, "") == NULL)
if (wcwidth(0xfffd) != 1) errx(1, "invalid LC_ALL, LC_CTYPE or LANG");
errx(1, "no UTF-8 locale; please set LC_CTYPE"); s = nl_langinfo(CODESET);
if (strcasecmp(s, "UTF-8") != 0 &&
strcasecmp(s, "UTF8") != 0)
errx(1, "need UTF-8 locale (LC_CTYPE) but have %s", s);
}
setlocale(LC_TIME, ""); setlocale(LC_TIME, "");
tzset(); tzset();