Michal Suchanek <[email protected]> wrote:
> FWIW here is a patch that
>
> a) tries to detect if user is running in utf-8 locale by a heuristic
> similar that that used in the autoconf test
setlocale(LC_CTYPE, "") only sets the current LC_CTYPE to the value of
the user environment.
If e.g. the user has LC_ALL=C the program will fail even if there is a
utf-8 locale it could use installed on the computer.
The attached patch first tries to set the locale found in the autoconf
script.
If that fails, it popens 'locale -a' and searches for a working utf-8
locale to use.
Bye
Patric
diff -r 79f840e44c31 src/charset.c
--- a/src/charset.c Mon Oct 23 23:20:43 2006 +0200
+++ b/src/charset.c Sat Feb 06 15:17:25 2010 +0100
@@ -34,20 +34,54 @@
#ifdef MULTIBYTE
iconv_t conv;
+char internal_locale[256];
#endif
/* ------------------------------------------------ */
#ifdef MULTIBYTE
+static int suffix(const char * str, const char * suffix)
+{
+ if ( strlen(str) < strlen(suffix) ) return 0;
+ if ( ! strcmp(suffix, str + ( strlen(str) - strlen(suffix) ) ) ) return 1;
+ return 0;
+}
+
+static int utf_8_locale(const char * locale)
+{
+ if (!locale) return 0;
+ return suffix(locale,".utf8") || suffix(locale, ".UTF-8");
+}
+
void init_multibyte()
{
- char *ret;
- ret = setlocale(LC_CTYPE, INTERNAL_LOCALE);
- if (ret==NULL) {
- fprintf(stderr, "setlocale failed with: %s\n\n", INTERNAL_LOCALE);
- exit(1);
+ char *locale_found;
+ if ((locale_found = setlocale(LC_CTYPE, INTERNAL_LOCALE))) {
+ strcpy(internal_locale, INTERNAL_LOCALE);
+ } else {
+ /* read all available locales */
+ FILE *fp = popen("locale -a", "r");
+ if (fp) {
+ while (!feof(fp) && !locale_found) {
+ char buf[256];
+ if (fgets(buf, sizeof(buf), fp) != NULL) {
+ /* remove newline */
+ buf[strlen(buf)-1] = '\0';
+ /* check for a working UTF-8 locale */
+ if (utf_8_locale(buf) &&
+ (locale_found = setlocale(LC_CTYPE, buf))) {
+ strcpy(internal_locale, buf);
+ }
+ }
+ }
+ }
+
+ if (locale_found == NULL) {
+ fprintf(stderr, "Could not find a UTF-8 locale! Please enable en_US.UTF-8!\n");
+ exit(EXIT_FAILURE);
+ }
+ pclose(fp);
}
- /*else { fprintf(stderr, "%s\n", ret); } */
}
#endif
diff -r 79f840e44c31 src/fileio.c
--- a/src/fileio.c Mon Oct 23 23:20:43 2006 +0200
+++ b/src/fileio.c Sat Feb 06 15:17:25 2010 +0100
@@ -27,6 +27,8 @@
#ifdef MULTIBYTE
#include <iconv.h>
#include <locale.h>
+
+extern char internal_locale;
#endif
FILE *in, *out;
@@ -100,9 +102,9 @@
output[strlen(output)] = '\0';
- ret = setlocale(LC_CTYPE, INTERNAL_LOCALE);
- if (ret==NULL) {
- fprintf(stderr, "setlocale failed with: %s\n\n", INTERNAL_LOCALE);
+ ret = setlocale(LC_CTYPE, internal_locale);
+ if (ret==NULL) {
+ fprintf(stderr, "setlocale failed with: %s\n\n", internal_locale);
exit(1);
}
mbstowcs(converted_string, output, strlen(output));
--
Homepage: http://bhaak.dyndns.org/
E-mail: [email protected] Jabber: [email protected] ICQ: 23653421
Languages: Deutsch, English
(Not fluently: Français, Italiano, Latinum)