  /*
   * This C function returns a canonical name for the character encoding
   * used in the current locale. It returns NULL if it cannot be determined.
   *
   * This is an alternative to nl_langinfo(CODESET).
   */

  #include <stddef.h>
  #include <stdlib.h>
  #include <string.h>

  #define streq(s1,s2) (!strcmp(s1,s2))

  const char* locale_charset = NULL;

  const char* get_locale_charset ()
    {
      // When you call setlocale(LC_CTYPE,""), is examines the environment
      // variables:
      // 1. environment variable LC_ALL - an override for all LC_* variables,
      // 2. environment variable LC_CTYPE,
      // 3. environment variable LANG - a default for all LC_* variables.
      const char * locale;
      locale = getenv("LC_ALL");
      if (!locale || !*locale) {
        locale = getenv("LC_CTYPE");
        if (!locale || !*locale)
          locale = getenv("LANG");
      }
      // Determine locale_charset from the environment variables.
      // Unfortunately there is no documented way of getting the character set
      // that was specified as part of the LC_CTYPE category. We have to parse
      // the environment variables ourselves.
      // Recall that a locale specification has the form
      //   language_COUNTRY.charset
      // but there are also aliases. Here is the union of what I found in
      // /usr/X11R6/lib/X11/locale/locale.alias (X11R6) and
      // /usr/share/locale/locale.alias (GNU libc2).
      //
      // X11R6 locale.alias:
      //   POSIX                   C
      //   POSIX-UTF2              C
      //   C_C.C                   C
      //   C.en                    C
      //   C.iso88591              en_US.ISO8859-1
      //   Cextend                 en_US.ISO8859-1
      //   Cextend.en              en_US.ISO8859-1
      //   English_United-States.437       C
      //   #
      //   ar                      ar_AA.ISO8859-6
      //   ar_AA                   ar_AA.ISO8859-6
      //   ar_AA.ISO_8859-6        ar_AA.ISO8859-6
      //   ar_SA.iso88596          ar_AA.ISO8859-6
      //   bg                      bg_BG.ISO8859-5
      //   bg_BG                   bg_BG.ISO8859-5
      //   bg_BG.ISO_8859-5        bg_BG.ISO8859-5
      //   bg_BG.iso88595          bg_BG.ISO8859-5
      //   cs                      cs_CZ.ISO8859-2
      //   cs_CS                   cs_CZ.ISO8859-2
      //   cs_CS.ISO8859-2         cs_CZ.ISO8859-2
      //   cs_CS.ISO_8859-2        cs_CZ.ISO8859-2
      //   cs_CZ.iso88592          cs_CZ.ISO8859-2
      //   cz                      cz_CZ.ISO8859-2
      //   cz_CZ                   cz_CZ.ISO8859-2
      //   cs_CZ.ISO_8859-2        cs_CZ.ISO8859-2
      //   da                      da_DK.ISO8859-1
      //   da_DK                   da_DK.ISO8859-1
      //   da_DK.88591             da_DK.ISO8859-1
      //   da_DK.88591.en          da_DK.ISO8859-1
      //   da_DK.iso88591          da_DK.ISO8859-1
      //   da_DK.ISO_8859-1        da_DK.ISO8859-1
      //   de                      de_DE.ISO8859-1
      //   de_AT                   de_AT.ISO8859-1
      //   de_AT.ISO_8859-1        de_AT.ISO8859-1
      //   de_CH                   de_CH.ISO8859-1
      //   de_CH.ISO_8859-1        de_CH.ISO8859-1
      //   de_DE                   de_DE.ISO8859-1
      //   de_DE.88591             de_DE.ISO8859-1
      //   de_DE.88591.en          de_DE.ISO8859-1
      //   de_DE.iso88591          de_DE.ISO8859-1
      //   de_DE.ISO_8859-1        de_DE.ISO8859-1
      //   GER_DE.8859             de_DE.ISO8859-1
      //   GER_DE.8859.in          de_DE.ISO8859-1
      //   el                      el_GR.ISO8859-7
      //   el_GR                   el_GR.ISO8859-7
      //   el_GR.iso88597          el_GR.ISO8859-7
      //   el_GR.ISO_8859-7        el_GR.ISO8859-7
      //   en                      en_US.ISO8859-1
      //   en_AU                   en_AU.ISO8859-1
      //   en_AU.ISO_8859-1        en_AU.ISO8859-1
      //   en_CA                   en_CA.ISO8859-1
      //   en_CA.ISO_8859-1        en_CA.ISO8859-1
      //   en_GB                   en_GB.ISO8859-1
      //   en_GB.88591             en_GB.ISO8859-1
      //   en_GB.88591.en          en_GB.ISO8859-1
      //   en_GB.iso88591          en_GB.ISO8859-1
      //   en_GB.ISO_8859-1        en_GB.ISO8859-1
      //   en_UK                   en_GB.ISO8859-1
      //   ENG_GB.8859             en_GB.ISO8859-1
      //   ENG_GB.8859.in          en_GB.ISO8859-1
      //   en_IE                   en_IE.ISO8859-1
      //   en_NZ                   en_NZ.ISO8859-1
      //   en_US                   en_US.ISO8859-1
      //   en_US.88591             en_US.ISO8859-1
      //   en_US.88591.en          en_US.ISO8859-1
      //   en_US.iso88591          en_US.ISO8859-1
      //   en_US.ISO_8859-1        en_US.ISO8859-1
      //   es                      es_ES.ISO8859-1
      //   es_AR                   es_AR.ISO8859-1
      //   es_BO                   es_BO.ISO8859-1
      //   es_CL                   es_CL.ISO8859-1
      //   es_CO                   es_CO.ISO8859-1
      //   es_CR                   es_CR.ISO8859-1
      //   es_EC                   es_EC.ISO8859-1
      //   es_ES                   es_ES.ISO8859-1
      //   es_ES.88591             es_ES.ISO8859-1
      //   es_ES.88591.en          es_ES.ISO8859-1
      //   es_ES.iso88591          es_ES.ISO8859-1
      //   es_ES.ISO_8859-1        es_ES.ISO8859-1
      //   es_GT                   es_GT.ISO8859-1
      //   es_MX                   es_MX.ISO8859-1
      //   es_NI                   es_NI.ISO8859-1
      //   es_PA                   es_PA.ISO8859-1
      //   es_PE                   es_PE.ISO8859-1
      //   es_PY                   es_PY.ISO8859-1
      //   es_SV                   es_SV.ISO8859-1
      //   es_UY                   es_UY.ISO8859-1
      //   es_VE                   es_VE.ISO8859-1
      //   fi                      fi_FI.ISO8859-1
      //   fi_FI                   fi_FI.ISO8859-1
      //   fi_FI.88591             fi_FI.ISO8859-1
      //   fi_FI.88591.en          fi_FI.ISO8859-1
      //   fi_FI.iso88591          fi_FI.ISO8859-1
      //   fi_FI.ISO_8859-1        fi_FI.ISO8859-1
      //   fr                      fr_FR.ISO8859-1
      //   fr_BE                   fr_BE.ISO8859-1
      //   fr_BE.88591             fr_BE.ISO8859-1
      //   fr_BE.88591.en          fr_BE.ISO8859-1
      //   fr_BE.ISO_8859-1        fr_BE.ISO8859-1
      //   fr_CA                   fr_CA.ISO8859-1
      //   fr_CA.88591             fr_CA.ISO8859-1
      //   fr_CA.88591.en          fr_CA.ISO8859-1
      //   fr_CA.iso88591          fr_CA.ISO8859-1
      //   fr_CA.ISO_8859-1        fr_CA.ISO8859-1
      //   fr_CH                   fr_CH.ISO8859-1
      //   fr_CH.88591             fr_CH.ISO8859-1
      //   fr_CH.88591.en          fr_CH.ISO8859-1
      //   fr_CH.ISO_8859-1        fr_CH.ISO8859-1
      //   fr_FR                   fr_FR.ISO8859-1
      //   fr_FR.88591             fr_FR.ISO8859-1
      //   fr_FR.88591.en          fr_FR.ISO8859-1
      //   fr_FR.iso88591          fr_FR.ISO8859-1
      //   fr_FR.ISO_8859-1        fr_FR.ISO8859-1
      //   FRE_FR.8859             fr_FR.ISO8859-1
      //   FRE_FR.8859.in          fr_FR.ISO8859-1
      //   he                      he_IL.ISO8859-8
      //   he_IL                   he_IL.ISO8859-8
      //   he_IL.iso88598          he_IL.ISO8859-8
      //   hr                      hr_HR.ISO8859-2
      //   hr_HR                   hr_HR.ISO8859-2
      //   hr_HR.iso88592          hr_HR.ISO8859-2
      //   hr_HR.ISO_8859-2        hr_HR.ISO8859-2
      //   hu                      hu_HU.ISO8859-2
      //   hu_HU                   hu_HU.ISO8859-2
      //   hu_HU.iso88592          hu_HU.ISO8859-2
      //   hu_HU.ISO_8859-2        hu_HU.ISO8859-2
      //   is                      is_IS.ISO8859-1
      //   is_IS                   is_IS.ISO8859-1
      //   is_IS.iso88591          is_IS.ISO8859-1
      //   is_IS.ISO_8859-1        is_IS.ISO8859-1
      //   it                      it_IT.ISO8859-1
      //   it_CH                   it_CH.ISO8859-1
      //   it_CH.ISO_8859-1        it_CH.ISO8859-1
      //   it_IT                   it_IT.ISO8859-1
      //   it_IT.88591             it_IT.ISO8859-1
      //   it_IT.88591.en          it_IT.ISO8859-1
      //   it_IT.iso88591          it_IT.ISO8859-1
      //   it_IT.ISO_8859-1        it_IT.ISO8859-1
      //   iw                      iw_IL.ISO8859-8
      //   iw_IL                   iw_IL.ISO8859-8
      //   iw_IL.iso88598          iw_IL.ISO8859-8
      //   iw_IL.ISO_8859-8        iw_IL.ISO8859-8
      //   ja                      ja_JP.eucJP
      //   ja_JP                   ja_JP.eucJP
      //   ja_JP.ujis              ja_JP.eucJP
      //   ja_JP.eucJP             ja_JP.eucJP
      //   Jp_JP                   ja_JP.eucJP
      //   ja_JP.AJEC              ja_JP.eucJP
      //   ja_JP.EUC               ja_JP.eucJP
      //   ja_JP.ISO-2022-JP       ja_JP.JIS7
      //   ja_JP.JIS               ja_JP.JIS7
      //   ja_JP.jis7              ja_JP.JIS7
      //   ja_JP.mscode            ja_JP.SJIS
      //   ja_JP.SJIS              ja_JP.SJIS
      //   ko                      ko_KR.eucKR
      //   ko_KR                   ko_KR.eucKR
      //   ko_KR.EUC               ko_KR.eucKR
      //   ko_KR.euc               ko_KR.eucKR
      //   # most locales in FreeBSD 2.1.[56] do not work, allow use of generic latin-1
      //   lt_LN.ISO_8859-1        lt_LN.ISO8859-1
      //   mk                      mk_MK.ISO8859-5
      //   mk_MK                   mk_MK.ISO8859-5
      //   mk_MK.ISO_8859-5        mk_MK.ISO8859-5
      //   nl                      nl_NL.ISO8859-1
      //   nl_BE                   nl_BE.ISO8859-1
      //   nl_BE.88591             nl_BE.ISO8859-1
      //   nl_BE.88591.en          nl_BE.ISO8859-1
      //   nl_BE.ISO_8859-1        nl_BE.ISO8859-1
      //   nl_NL                   nl_NL.ISO8859-1
      //   nl_NL.88591             nl_NL.ISO8859-1
      //   nl_NL.88591.en          nl_NL.ISO8859-1
      //   nl_NL.iso88591          nl_NL.ISO8859-1
      //   nl_NL.ISO_8859-1        nl_NL.ISO8859-1
      //   no                      no_NO.ISO8859-1
      //   no_NO                   no_NO.ISO8859-1
      //   no_NO.88591             no_NO.ISO8859-1
      //   no_NO.88591.en          no_NO.ISO8859-1
      //   no_NO.iso88591          no_NO.ISO8859-1
      //   no_NO.ISO_8859-1        no_NO.ISO8859-1
      //   pl                      pl_PL.ISO8859-2
      //   pl_PL                   pl_PL.ISO8859-2
      //   pl_PL.iso88592          pl_PL.ISO8859-2
      //   pl_PL.ISO_8859-2        pl_PL.ISO8859-2
      //   pt                      pt_PT.ISO8859-1
      //   pt_BR                   pt_BR.ISO8859-1
      //   pt_PT                   pt_PT.ISO8859-1
      //   pt_PT.88591             pt_PT.ISO8859-1
      //   pt_PT.88591.en          pt_PT.ISO8859-1
      //   pt_PT.iso88591          pt_PT.ISO8859-1
      //   pt_PT.ISO_8859-1        pt_PT.ISO8859-1
      //   ro                      ro_RO.ISO8859-2
      //   ro_RO                   ro_RO.ISO8859-2
      //   ro_RO.iso88592          ro_RO.ISO8859-2
      //   ro_RO.ISO_8859-2        ro_RO.ISO8859-2
      //   ru                      ru_RU.ISO8859-5
      //   ru_RU                   ru_RU.ISO8859-5
      //   ru_RU.iso88595          ru_RU.ISO8859-5
      //   ru_RU.ISO_8859-5        ru_RU.ISO8859-5
      //   ru_SU                   ru_RU.ISO8859-5
      //   ru_SU.ISO8859-5         ru_RU.ISO8859-5
      //   ru_SU.ISO_8859-5        ru_RU.ISO8859-5
      //   ru_SU.KOI8-R            ru_RU.KOI8-R
      //   sh                      sh_YU.ISO8859-2
      //   sh_YU                   sh_YU.ISO8859-2
      //   sh_YU.ISO_8859-2        sh_YU.ISO8859-2
      //   sh_SP                   sh_YU.ISO8859-2
      //   sk                      sk_SK.ISO8859-2
      //   sk_SK                   sk_SK.ISO8859-2
      //   sk_SK.ISO_8859-2        sk_SK.ISO8859-2
      //   sl                      sl_CS.ISO8859-2
      //   sl_CS                   sl_CS.ISO8859-2
      //   sl_CS.ISO_8859-2        sl_CS.ISO8859-2
      //   sl_SI                   sl_SI.ISO8859-2
      //   sl_SI.iso88592          sl_SI.ISO8859-2
      //   sl_SI.ISO_8859-2        sl_SI.ISO8859-2
      //   sp                      sp_YU.ISO8859-5
      //   sp_YU                   sp_YU.ISO8859-5
      //   sp_YU.ISO_8859-5        sp_YU.ISO8859-5
      //   sr_SP                   sr_SP.ISO8859-2
      //   sr_SP.ISO_8859-2        sr_SP.ISO8859-2
      //   sv                      sv_SE.ISO8859-1
      //   sv_SE                   sv_SE.ISO8859-1
      //   sv_SE.88591             sv_SE.ISO8859-1
      //   sv_SE.88591.en          sv_SE.ISO8859-1
      //   sv_SE.iso88591          sv_SE.ISO8859-1
      //   sv_SE.ISO_8859-1        sv_SE.ISO8859-1
      //   th_TH                   th_TH.TACTIS
      //   tr                      tr_TR.ISO8859-9
      //   tr_TR                   tr_TR.ISO8859-9
      //   tr_TR.iso88599          tr_TR.ISO8859-9
      //   tr_TR.ISO_8859-9        tr_TR.ISO8859-9
      //   zh                      zh_CN.eucCN
      //   zh_CN                   zh_CN.eucCN
      //   zh_CN.EUC               zh_CN.eucCN
      //   zh_TW                   zh_TW.eucTW
      //   zh_TW.EUC               zh_TW.eucTW
      //   # The following locale names are used in SCO 3.0
      //   english_uk.8859         en_GB.ISO8859-1
      //   english_us.8859         en_US.ISO8859-1
      //   english_us.ascii        en_US.ISO8859-1
      //   french_france.8859      fr_FR.ISO8859-1
      //   german_germany.8859     de_DE.ISO8859-1
      //   portuguese_brazil.8859  pt_BR.ISO8859-1
      //   spanish_spain.8859      es_ES.ISO8859-1
      //   # The following locale names are used in HPUX 9.x
      //   american.iso88591       en_US.ISO8859-1
      //   arabic.iso88596         ar_AA.ISO8859-6
      //   bulgarian               bg_BG.ISO8859-5
      //   c-french.iso88591       fr_CA.ISO8859-1
      //   chinese-s               zh_CN.eucCN
      //   chinese-t               zh_TW.eucTW
      //   croatian                hr_HR.ISO8859-2
      //   czech                   cs_CS.ISO8859-2
      //   danish.iso88591         da_DK.ISO8859-1
      //   dutch.iso88591          nl_BE.ISO8859-1
      //   english.iso88591        en_EN.ISO8859-1
      //   finnish.iso88591        fi_FI.ISO8859-1
      //   french.iso88591         fr_CH.ISO8859-1
      //   german.iso88591         de_CH.ISO8859-1
      //   greek.iso88597          el_GR.ISO8859-7
      //   hebrew.iso88598         iw_IL.ISO8859-8
      //   hungarian               hu_HU.ISO8859-2
      //   icelandic.iso88591      is_IS.ISO8859-1
      //   italian.iso88591        it_IT.ISO8859-1
      //   japanese                ja_JP.SJIS
      //   japanese.euc            ja_JP.eucJP
      //   korean                  ko_KR.eucKR
      //   norwegian.iso88591      no_NO.ISO8859-1
      //   polish                  pl_PL.ISO8859-2
      //   portuguese.iso88591     pt_PT.ISO8859-1
      //   rumanian                ro_RO.ISO8859-2
      //   russian                 ru_SU.ISO8859-5
      //   serbocroatian           sh_YU.ISO8859-2
      //   slovak                  sk_SK.ISO8859-2
      //   slovene                 sl_CS.ISO8859-2
      //   spanish.iso88591        es_ES.ISO8859-1
      //   swedish.iso88591        sv_SE.ISO8859-1
      //   turkish.iso88599        tr_TR.ISO8859-9
      //   # Solaris and SunOS have iso_8859_1 LC_CTYPES to augment LANG=C
      //   iso_8859_1              en_US.ISO8859-1
      //   # Microsoft Windows/NT 3.51 Japanese Edition
      //   Korean_Korea.949        ko_KR.eucKR
      //   Japanese_Japan.932      ja_JP.SJIS
      //   # Other miscellaneous locale names
      //   ISO8859-1               en_US.ISO8859-1
      //   ISO-8859-1              en_US.ISO8859-1
      //   japan                   ja_JP.eucJP
      //   Japanese-EUC            ja_JP.eucJP
      //
      // GNU locale.alias:
      //   czech                   cs_CZ.ISO-8859-2
      //   danish                  da_DK.ISO-8859-1
      //   dansk                   da_DK.ISO-8859-1
      //   deutsch                 de_DE.ISO-8859-1
      //   dutch                   nl_NL.ISO-8859-1
      //   finnish                 fi_FI.ISO-8859-1
      //   fran#ais                fr_FR.ISO-8859-1
      //   french                  fr_FR.ISO-8859-1
      //   german                  de_DE.ISO-8859-1
      //   greek                   el_GR.ISO-8859-7
      //   hebrew                  iw_IL.ISO-8859-8
      //   hungarian               hu_HU.ISO-8859-2
      //   icelandic               is_IS.ISO-8859-1
      //   italian                 it_IT.ISO-8859-1
      //   japanese                ja_JP.SJIS
      //   japanese.euc            ja_JP.eucJP
      //   norwegian               no_NO.ISO-8859-1
      //   polish                  pl_PL.ISO-8859-2
      //   portuguese              pt_PT.ISO-8859-1
      //   romanian                ro_RO.ISO-8859-2
      //   russian                 ru_RU.ISO-8859-5
      //   slovak                  sk_SK.ISO-8859-2
      //   slovene                 sl_CS.ISO-8859-2
      //   spanish                 es_ES.ISO-8859-1
      //   swedish                 sv_SE.ISO-8859-1
      //   turkish                 tr_TR.ISO-8859-9
      //
      if (locale && *locale) {
        // The most general syntax of a locale (not all optional parts
        // recognized by all systems) is
        // language[_territory][.codeset][@modifier][+special][,[sponsor][_revision]]
        // To retrieve the codeset, search the first dot. Stop searching when
        // a '@' or '+' or ',' is encountered.
        char* buf = (char*) malloc(strlen(locale)+1);
        const char* codeset = NULL;
        {
          const char* cp = locale;
          for (; *cp != '\0' && *cp != '@' && *cp != '+' && *cp != ','; cp++) {
            if (*cp == '.') {
              codeset = ++cp;
              for (; *cp != '\0' && *cp != '@' && *cp != '+' && *cp != ','; cp++);
              if (*cp != '\0') {
                size_t n = cp - codeset;
                memcpy(buf,codeset,n);
                buf[n] = '\0';
                codeset = buf;
              }
              break;
            }
          }
        }
        if (codeset) {
          // Canonicalize the charset given after the dot.
          if (   streq(codeset,"ISO8859-1")
              || streq(codeset,"ISO_8859-1")
              || streq(codeset,"iso88591")
              || streq(codeset,"88591")
              || streq(codeset,"88591.en")
              || streq(codeset,"8859")
              || streq(codeset,"8859.in")
              || streq(codeset,"ascii")
             )
            locale_charset = "ISO-8859-1";
          else
          if (   streq(codeset,"ISO8859-2")
              || streq(codeset,"ISO_8859-2")
              || streq(codeset,"iso88592")
             )
            locale_charset = "ISO-8859-2";
          else
          if (   streq(codeset,"ISO8859-5")
              || streq(codeset,"ISO_8859-5")
              || streq(codeset,"iso88595")
             )
            locale_charset = "ISO-8859-5";
          else
          if (   streq(codeset,"ISO8859-6")
              || streq(codeset,"ISO_8859-6")
              || streq(codeset,"iso88596")
             )
            locale_charset = "ISO-8859-6";
          else
          if (   streq(codeset,"ISO8859-7")
              || streq(codeset,"ISO_8859-7")
              || streq(codeset,"iso88597")
             )
            locale_charset = "ISO-8859-7";
          else
          if (   streq(codeset,"ISO8859-8")
              || streq(codeset,"iso88598")
             )
            locale_charset = "ISO-8859-8";
          else
          if (   streq(codeset,"ISO8859-9")
              || streq(codeset,"ISO_8859-9")
              || streq(codeset,"iso88599")
             )
            locale_charset = "ISO-8859-9";
          else
          if (streq(codeset,"KOI8-R"))
            locale_charset = "KOI8-R";
          else
          if (streq(codeset,"KOI8-U"))
            locale_charset = "KOI8-U";
          else
          if (   streq(codeset,"eucJP")
              || streq(codeset,"ujis")
              || streq(codeset,"AJEC")
             )
            locale_charset = "eucJP";
          else
          if (   streq(codeset,"JIS7")
              || streq(codeset,"jis7")
              || streq(codeset,"JIS")
              || streq(codeset,"ISO-2022-JP")
             )
            locale_charset = "ISO-2022-JP"; /* was: "JIS7"; */
          else
          if (   streq(codeset,"SJIS")
              || streq(codeset,"mscode")
              || streq(codeset,"932")
             )
            locale_charset = "SJIS";
          else
          if (   streq(codeset,"eucKR")
              || streq(codeset,"949")
             )
            locale_charset = "eucKR";
          else
          if (streq(codeset,"eucCN"))
            locale_charset = "eucCN";
          else
          if (streq(codeset,"eucTW"))
            locale_charset = "eucTW";
          else
          if (streq(codeset,"TACTIS"))
            locale_charset = "TIS-620"; /* was: "TACTIS"; */
          else
          if (streq(codeset,"EUC") || streq(codeset,"euc")) {
            if (locale[0]=='j' && locale[1]=='a')
              locale_charset = "eucJP";
            else if (locale[0]=='k' && locale[1]=='o')
              locale_charset = "eucKR";
            else if (locale[0]=='z' && locale[1]=='h' && locale[2]=='_') {
              if (locale[3]=='C' && locale[4]=='N')
                locale_charset = "eucCN";
              else if (locale[3]=='T' && locale[4]=='W')
                locale_charset = "eucTW";
            }
          }
          else
          // The following are CLISP extensions.
          if (   streq(codeset,"UTF-8")
              || streq(codeset,"utf8")
             )
            locale_charset = "UTF-8";
        } else {
          // No dot found. Choose a default, based on locale.
          if (   streq(locale,"iso_8859_1")
              || streq(locale,"ISO8859-1")
              || streq(locale,"ISO-8859-1")
             )
            locale_charset = "ISO-8859-1";
          else
          if (0)
            locale_charset = "ISO-8859-2";
          else
          if (0)
            locale_charset = "ISO-8859-5";
          else
          if (0)
            locale_charset = "ISO-8859-6";
          else
          if (0)
            locale_charset = "ISO-8859-7";
          else
          if (0)
            locale_charset = "ISO-8859-8";
          else
          if (0)
            locale_charset = "ISO-8859-9";
          else
          if (0)
            locale_charset = "KOI8-R";
          else
          if (0)
            locale_charset = "KOI8-U";
          else
          if (0)
            locale_charset = "eucJP";
          else
          if (0)
            locale_charset = "ISO-2022-JP"; /* was: "JIS7"; */
          else
          if (0)
            locale_charset = "SJIS";
          else
          if (0)
            locale_charset = "eucKR";
          else
          if (streq(locale,"zh_CN") || streq(locale,"zh")
             )
            locale_charset = "eucCN";
          else
          if (streq(locale,"zh_TW")
             )
            locale_charset = "eucTW";
          else
          if (0)
            locale_charset = "TIS-620"; /* was: "TACTIS"; */
          else {
            // Choose a default, based on the language only.
            const char* underscore = strchr(locale,'_');
            const char* lang;
            if (underscore) {
              size_t n = underscore - locale;
              memcpy(buf,locale,n);
              buf[n] = '\0';
              lang = buf;
            } else {
              lang = locale;
            }
            if (   streq(lang,"af") || streq(lang,"afrikaans")
                || streq(lang,"ca") || streq(lang,"catalan")
                || streq(lang,"da") || streq(lang,"danish") || streq(lang,"dansk")
                || streq(lang,"de") || streq(lang,"german") || streq(lang,"deutsch")
                || streq(lang,"en") || streq(lang,"english")
                || streq(lang,"es") || streq(lang,"spanish")
                || streq(lang,"eu") || streq(lang,"basque")
                || streq(lang,"fi") || streq(lang,"finnish")
                || streq(lang,"fo") || streq(lang,"faroese") || streq(lang,"faeroese")
                || streq(lang,"fr") || streq(lang,"french")
                                          #ifndef ASCII_CHS
                                          || streq(lang,"français")
                                          #endif
                || streq(lang,"ga") || streq(lang,"irish")
                || streq(lang,"gd") || streq(lang,"scottish")
                || streq(lang,"gl") || streq(lang,"galician")
                || streq(lang,"is") || streq(lang,"icelandic")
                || streq(lang,"it") || streq(lang,"italian")
                || streq(lang,"nl") || streq(lang,"dutch")
                || streq(lang,"no") || streq(lang,"norwegian")
                || streq(lang,"pt") || streq(lang,"portuguese")
                || streq(lang,"sv") || streq(lang,"swedish")
               )
              locale_charset = "ISO-8859-1";
            else
            if (   streq(lang,"cs") || streq(lang,"czech")
                || streq(lang,"cz")
                || streq(lang,"hr") || streq(lang,"croatian")
                || streq(lang,"hu") || streq(lang,"hungarian")
                || streq(lang,"pl") || streq(lang,"polish")
                || streq(lang,"ro") || streq(lang,"romanian") || streq(lang,"rumanian")
                || streq(lang,"sh") /* || streq(lang,"serbocroatian") ?? */
                || streq(lang,"sk") || streq(lang,"slovak")
                || streq(lang,"sl") || streq(lang,"slovene") || streq(lang,"slovenian")
                || streq(lang,"sq") || streq(lang,"albanian")
               )
              locale_charset = "ISO-8859-2";
            else
            if (   streq(lang,"eo") || streq(lang,"esperanto")
                || streq(lang,"mt") || streq(lang,"maltese")
               )
              locale_charset = "ISO-8859-3";
            else
            if (   streq(lang,"be") || streq(lang,"byelorussian")
                || streq(lang,"bg") || streq(lang,"bulgarian")
                || streq(lang,"mk") || streq(lang,"macedonian")
                || streq(lang,"sp")
                || streq(lang,"sr") || streq(lang,"serbian")
               )
              locale_charset = "ISO-8859-5";
            else
            if (streq(lang,"ar") || streq(lang,"arabic")
               )
              locale_charset = "ISO-8859-6";
            else
            if (streq(lang,"el") || streq(lang,"greek")
               )
              locale_charset = "ISO-8859-7";
            else
            if (streq(lang,"iw") || streq(lang,"he") || streq(lang,"hebrew")
               )
              locale_charset = "ISO-8859-8";
            else
            if (streq(lang,"tr") || streq(lang,"turkish")
               )
              locale_charset = "ISO-8859-9";
            else
            if (   streq(lang,"et") || streq(lang,"estonian")
                || streq(lang,"lt") || streq(lang,"lithuanian")
                || streq(lang,"lv") || streq(lang,"latvian")
               )
              locale_charset = "ISO-8859-10";
            else
            if (streq(lang,"ru") || streq(lang,"russian")
               )
              locale_charset = "KOI8-R";
            else
            if (streq(lang,"uk") || streq(lang,"ukrainian")
               )
              locale_charset = "KOI8-U";
            else
            if (   streq(lang,"ja")
                || streq(lang,"Jp")
                || streq(lang,"japan")
                || streq(lang,"Japanese-EUC")
               )
              locale_charset = "eucJP";
            else
            if (0)
              locale_charset = "ISO-2022-JP"; /* was: "JIS7"; */
            else
            if (streq(lang,"japanese")
               )
              locale_charset = "SJIS";
            else
            if (streq(lang,"ko") || streq(lang,"korean")
               )
              locale_charset = "eucKR";
            else
            if (streq(lang,"chinese-s")
               )
              locale_charset = "eucCN";
            else
            if (streq(lang,"chinese-t")
               )
              locale_charset = "eucTW";
            else
            if (streq(lang,"th")
               )
              locale_charset = "TIS-620"; /* was: "TACTIS"; */
            else {
            }
          }
        }
        free(buf);
      }
      return locale_charset;
    }

