Cygwin: locale: Set default charset from Linux locale -> codeset mapping

Generate lc_def_codeset.h header containing the default mapping from
locale to codeset on Linux.  Use this mapping in __set_charset_from_locale
in the first place.

For every locale not covered by this table, just map Windows codepages
to equivalent codesets used on Linux/Unix, getting rid of LCIDs entirely.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2023-02-25 16:11:54 +01:00
parent 7b591704b8
commit 2483e54be8
2 changed files with 376 additions and 122 deletions

View File

@ -0,0 +1,342 @@
/* This struct of default codesets has been generated by fetching
locale data from a Linux system using glibc-2.36-9.fc37.x86_64 on 2023-02-25 */
struct default_codeset_t
{
const char *locale;
const char *codeset;
} default_codeset[] =
{
{ "aa_DJ", "ISO-8859-1" },
{ "aa_ER", "UTF-8" },
{ "aa_ER@saaho", "UTF-8" },
{ "aa_ET", "UTF-8" },
{ "af_ZA", "ISO-8859-1" },
{ "agr_PE", "UTF-8" },
{ "ak_GH", "UTF-8" },
{ "am_ET", "UTF-8" },
{ "an_ES", "ISO-8859-15" },
{ "anp_IN", "UTF-8" },
{ "ar_AE", "ISO-8859-6" },
{ "ar_BH", "ISO-8859-6" },
{ "ar_DZ", "ISO-8859-6" },
{ "ar_EG", "ISO-8859-6" },
{ "ar_IN", "UTF-8" },
{ "ar_IQ", "ISO-8859-6" },
{ "ar_JO", "ISO-8859-6" },
{ "ar_KW", "ISO-8859-6" },
{ "ar_LB", "ISO-8859-6" },
{ "ar_LY", "ISO-8859-6" },
{ "ar_MA", "ISO-8859-6" },
{ "ar_OM", "ISO-8859-6" },
{ "ar_QA", "ISO-8859-6" },
{ "ar_SA", "ISO-8859-6" },
{ "ar_SD", "ISO-8859-6" },
{ "ar_SS", "UTF-8" },
{ "ar_SY", "ISO-8859-6" },
{ "ar_TN", "ISO-8859-6" },
{ "ar_YE", "ISO-8859-6" },
{ "as_IN", "UTF-8" },
{ "ast_ES", "ISO-8859-15" },
{ "ayc_PE", "UTF-8" },
{ "az_AZ", "UTF-8" },
{ "az_IR", "UTF-8" },
{ "be_BY", "CP1251" },
{ "be_BY@latin", "UTF-8" },
{ "bem_ZM", "UTF-8" },
{ "ber_DZ", "UTF-8" },
{ "ber_MA", "UTF-8" },
{ "bg_BG", "CP1251" },
{ "bho_IN", "UTF-8" },
{ "bho_NP", "UTF-8" },
{ "bi_VU", "UTF-8" },
{ "bn_BD", "UTF-8" },
{ "bn_IN", "UTF-8" },
{ "bo_CN", "UTF-8" },
{ "bo_IN", "UTF-8" },
{ "br_FR", "ISO-8859-1" },
{ "br_FR@euro", "ISO-8859-15" },
{ "brx_IN", "UTF-8" },
{ "bs_BA", "ISO-8859-2" },
{ "byn_ER", "UTF-8" },
{ "ca_AD", "ISO-8859-15" },
{ "ca_ES", "ISO-8859-1" },
{ "ca_ES@euro", "ISO-8859-15" },
{ "ca_ES@valencia", "UTF-8" },
{ "ca_FR", "ISO-8859-15" },
{ "ca_IT", "ISO-8859-15" },
{ "ce_RU", "UTF-8" },
{ "chr_US", "UTF-8" },
{ "ckb_IQ", "UTF-8" },
{ "cmn_TW", "UTF-8" },
{ "crh_UA", "UTF-8" },
{ "cs_CZ", "ISO-8859-2" },
{ "csb_PL", "UTF-8" },
{ "cv_RU", "UTF-8" },
{ "cy_GB", "ISO-8859-14" },
{ "da_DK", "ISO-8859-1" },
{ "de_AT", "ISO-8859-1" },
{ "de_AT@euro", "ISO-8859-15" },
{ "de_BE", "ISO-8859-1" },
{ "de_BE@euro", "ISO-8859-15" },
{ "de_CH", "ISO-8859-1" },
{ "de_DE", "ISO-8859-1" },
{ "de_DE@euro", "ISO-8859-15" },
{ "de_IT", "ISO-8859-1" },
{ "de_LU", "ISO-8859-1" },
{ "de_LU@euro", "ISO-8859-15" },
{ "doi_IN", "UTF-8" },
{ "dsb_DE", "UTF-8" },
{ "dv_MV", "UTF-8" },
{ "dz_BT", "UTF-8" },
{ "el_CY", "ISO-8859-7" },
{ "el_GR", "ISO-8859-7" },
{ "el_GR@euro", "ISO-8859-7" },
{ "en_AG", "UTF-8" },
{ "en_AU", "ISO-8859-1" },
{ "en_BW", "ISO-8859-1" },
{ "en_CA", "ISO-8859-1" },
{ "en_DK", "ISO-8859-1" },
{ "en_GB", "ISO-8859-1" },
{ "en_HK", "ISO-8859-1" },
{ "en_IE", "ISO-8859-1" },
{ "en_IE@euro", "ISO-8859-15" },
{ "en_IL", "UTF-8" },
{ "en_IN", "UTF-8" },
{ "en_NG", "UTF-8" },
{ "en_NZ", "ISO-8859-1" },
{ "en_PH", "ISO-8859-1" },
{ "en_SG", "ISO-8859-1" },
{ "en_US", "ISO-8859-1" },
{ "en_ZA", "ISO-8859-1" },
{ "en_ZM", "UTF-8" },
{ "en_ZW", "ISO-8859-1" },
{ "es_AR", "ISO-8859-1" },
{ "es_BO", "ISO-8859-1" },
{ "es_CL", "ISO-8859-1" },
{ "es_CO", "ISO-8859-1" },
{ "es_CR", "ISO-8859-1" },
{ "es_CU", "UTF-8" },
{ "es_DO", "ISO-8859-1" },
{ "es_EC", "ISO-8859-1" },
{ "es_ES", "ISO-8859-1" },
{ "es_ES@euro", "ISO-8859-15" },
{ "es_GT", "ISO-8859-1" },
{ "es_HN", "ISO-8859-1" },
{ "es_MX", "ISO-8859-1" },
{ "es_NI", "ISO-8859-1" },
{ "es_PA", "ISO-8859-1" },
{ "es_PE", "ISO-8859-1" },
{ "es_PR", "ISO-8859-1" },
{ "es_PY", "ISO-8859-1" },
{ "es_SV", "ISO-8859-1" },
{ "es_US", "ISO-8859-1" },
{ "es_UY", "ISO-8859-1" },
{ "es_VE", "ISO-8859-1" },
{ "et_EE", "ISO-8859-1" },
{ "eu_ES", "ISO-8859-1" },
{ "eu_ES@euro", "ISO-8859-15" },
{ "fa_IR", "UTF-8" },
{ "ff_SN", "UTF-8" },
{ "fi_FI", "ISO-8859-1" },
{ "fi_FI@euro", "ISO-8859-15" },
{ "fil_PH", "UTF-8" },
{ "fo_FO", "ISO-8859-1" },
{ "fr_BE", "ISO-8859-1" },
{ "fr_BE@euro", "ISO-8859-15" },
{ "fr_CA", "ISO-8859-1" },
{ "fr_CH", "ISO-8859-1" },
{ "fr_FR", "ISO-8859-1" },
{ "fr_FR@euro", "ISO-8859-15" },
{ "fr_LU", "ISO-8859-1" },
{ "fr_LU@euro", "ISO-8859-15" },
{ "fur_IT", "UTF-8" },
{ "fy_DE", "UTF-8" },
{ "fy_NL", "UTF-8" },
{ "ga_IE", "ISO-8859-1" },
{ "ga_IE@euro", "ISO-8859-15" },
{ "gd_GB", "ISO-8859-15" },
{ "gez_ER", "UTF-8" },
{ "gez_ER@abegede", "UTF-8" },
{ "gez_ET", "UTF-8" },
{ "gez_ET@abegede", "UTF-8" },
{ "gl_ES", "ISO-8859-1" },
{ "gl_ES@euro", "ISO-8859-15" },
{ "gu_IN", "UTF-8" },
{ "gv_GB", "ISO-8859-1" },
{ "ha_NG", "UTF-8" },
{ "hak_TW", "UTF-8" },
{ "he_IL", "ISO-8859-8" },
{ "hi_IN", "UTF-8" },
{ "hif_FJ", "UTF-8" },
{ "hne_IN", "UTF-8" },
{ "hr_HR", "ISO-8859-2" },
{ "hsb_DE", "ISO-8859-2" },
{ "ht_HT", "UTF-8" },
{ "hu_HU", "ISO-8859-2" },
{ "hy_AM", "UTF-8" },
{ "ia_FR", "UTF-8" },
{ "id_ID", "ISO-8859-1" },
{ "ig_NG", "UTF-8" },
{ "ik_CA", "UTF-8" },
{ "is_IS", "ISO-8859-1" },
{ "it_CH", "ISO-8859-1" },
{ "it_IT", "ISO-8859-1" },
{ "it_IT@euro", "ISO-8859-15" },
{ "iu_CA", "UTF-8" },
{ "ja_JP", "EUC-JP" },
{ "ka_GE", "GEORGIAN-PS" },
{ "kab_DZ", "UTF-8" },
{ "kk_KZ", "PT154" },
{ "kl_GL", "ISO-8859-1" },
{ "km_KH", "UTF-8" },
{ "kn_IN", "UTF-8" },
{ "ko_KR", "EUC-KR" },
{ "kok_IN", "UTF-8" },
{ "ks_IN", "UTF-8" },
{ "ks_IN@devanagar", "UTF-8" },
{ "ku_TR", "ISO-8859-9" },
{ "kw_GB", "ISO-8859-1" },
{ "ky_KG", "UTF-8" },
{ "lb_LU", "UTF-8" },
{ "lg_UG", "ISO-8859-10" },
{ "li_BE", "UTF-8" },
{ "li_NL", "UTF-8" },
{ "lij_IT", "UTF-8" },
{ "ln_CD", "UTF-8" },
{ "lo_LA", "UTF-8" },
{ "lt_LT", "ISO-8859-13" },
{ "lv_LV", "ISO-8859-13" },
{ "lzh_TW", "UTF-8" },
{ "mag_IN", "UTF-8" },
{ "mai_IN", "UTF-8" },
{ "mai_NP", "UTF-8" },
{ "mfe_MU", "UTF-8" },
{ "mg_MG", "ISO-8859-15" },
{ "mhr_RU", "UTF-8" },
{ "mi_NZ", "ISO-8859-13" },
{ "miq_NI", "UTF-8" },
{ "mjw_IN", "UTF-8" },
{ "mk_MK", "ISO-8859-5" },
{ "ml_IN", "UTF-8" },
{ "mn_MN", "UTF-8" },
{ "mni_IN", "UTF-8" },
{ "mnw_MM", "UTF-8" },
{ "mr_IN", "UTF-8" },
{ "ms_MY", "ISO-8859-1" },
{ "mt_MT", "ISO-8859-3" },
{ "my_MM", "UTF-8" },
{ "nan_TW", "UTF-8" },
{ "nan_TW@latin", "UTF-8" },
{ "nb_NO", "ISO-8859-1" },
{ "nds_DE", "UTF-8" },
{ "nds_NL", "UTF-8" },
{ "ne_NP", "UTF-8" },
{ "nhn_MX", "UTF-8" },
{ "niu_NU", "UTF-8" },
{ "niu_NZ", "UTF-8" },
{ "nl_AW", "UTF-8" },
{ "nl_BE", "ISO-8859-1" },
{ "nl_BE@euro", "ISO-8859-15" },
{ "nl_NL", "ISO-8859-1" },
{ "nl_NL@euro", "ISO-8859-15" },
{ "nn_NO", "ISO-8859-1" },
{ "no_NO", "ISO-8859-1" },
{ "nr_ZA", "UTF-8" },
{ "nso_ZA", "UTF-8" },
{ "oc_FR", "ISO-8859-1" },
{ "om_ET", "UTF-8" },
{ "om_KE", "ISO-8859-1" },
{ "or_IN", "UTF-8" },
{ "os_RU", "UTF-8" },
{ "pa_IN", "UTF-8" },
{ "pa_PK", "UTF-8" },
{ "pap_AW", "UTF-8" },
{ "pap_CW", "UTF-8" },
{ "pl_PL", "ISO-8859-2" },
{ "ps_AF", "UTF-8" },
{ "pt_BR", "ISO-8859-1" },
{ "pt_PT", "ISO-8859-1" },
{ "pt_PT@euro", "ISO-8859-15" },
{ "quz_PE", "UTF-8" },
{ "raj_IN", "UTF-8" },
{ "rif_MA", "UTF-8" },
{ "ro_RO", "ISO-8859-2" },
{ "ru_RU", "ISO-8859-5" },
{ "ru_UA", "KOI8-U" },
{ "rw_RW", "UTF-8" },
{ "sa_IN", "UTF-8" },
{ "sah_RU", "UTF-8" },
{ "sat_IN", "UTF-8" },
{ "sc_IT", "UTF-8" },
{ "sd_IN", "UTF-8" },
{ "sd_IN@devanagar", "UTF-8" },
{ "se_NO", "UTF-8" },
{ "sgs_LT", "UTF-8" },
{ "shn_MM", "UTF-8" },
{ "shs_CA", "UTF-8" },
{ "si_LK", "UTF-8" },
{ "sid_ET", "UTF-8" },
{ "sk_SK", "ISO-8859-2" },
{ "sl_SI", "ISO-8859-2" },
{ "sm_WS", "UTF-8" },
{ "so_DJ", "ISO-8859-1" },
{ "so_ET", "UTF-8" },
{ "so_KE", "ISO-8859-1" },
{ "so_SO", "ISO-8859-1" },
{ "sq_AL", "ISO-8859-1" },
{ "sq_MK", "UTF-8" },
{ "sr_ME", "UTF-8" },
{ "sr_RS", "UTF-8" },
{ "sr_RS@latin", "UTF-8" },
{ "ss_ZA", "UTF-8" },
{ "st_ZA", "ISO-8859-1" },
{ "sv_FI", "ISO-8859-1" },
{ "sv_FI@euro", "ISO-8859-15" },
{ "sv_SE", "ISO-8859-1" },
{ "sw_KE", "UTF-8" },
{ "sw_TZ", "UTF-8" },
{ "szl_PL", "UTF-8" },
{ "ta_IN", "UTF-8" },
{ "ta_LK", "UTF-8" },
{ "te_IN", "UTF-8" },
{ "tg_TJ", "KOI8-T" },
{ "th_TH", "TIS-620" },
{ "the_NP", "UTF-8" },
{ "ti_ER", "UTF-8" },
{ "ti_ET", "UTF-8" },
{ "tig_ER", "UTF-8" },
{ "tk_TM", "UTF-8" },
{ "tl_PH", "ISO-8859-1" },
{ "tn_ZA", "UTF-8" },
{ "to_TO", "UTF-8" },
{ "tpi_PG", "UTF-8" },
{ "tr_CY", "ISO-8859-9" },
{ "tr_TR", "ISO-8859-9" },
{ "ts_ZA", "UTF-8" },
{ "tt_RU", "UTF-8" },
{ "tt_RU@iqtelif", "UTF-8" },
{ "ug_CN", "UTF-8" },
{ "uk_UA", "KOI8-U" },
{ "unm_US", "UTF-8" },
{ "ur_IN", "UTF-8" },
{ "ur_PK", "UTF-8" },
{ "uz_UZ", "ISO-8859-1" },
{ "uz_UZ@cyrillic", "UTF-8" },
{ "ve_ZA", "UTF-8" },
{ "vi_VN", "UTF-8" },
{ "wa_BE", "ISO-8859-1" },
{ "wa_BE@euro", "ISO-8859-15" },
{ "wae_CH", "UTF-8" },
{ "wal_ET", "UTF-8" },
{ "wo_SN", "UTF-8" },
{ "xh_ZA", "ISO-8859-1" },
{ "yi_US", "CP1255" },
{ "yo_NG", "UTF-8" },
{ "yue_HK", "UTF-8" },
{ "yuw_PG", "UTF-8" },
{ "zh_CN", "GB2312" },
{ "zh_HK", "BIG5" },
{ "zh_SG", "GB2312" },
{ "zh_TW", "BIG5" },
{ "zu_ZA", "ISO-8859-1" },
};

View File

@ -21,6 +21,7 @@ details. */
#include "lc_msg.h" #include "lc_msg.h"
#include "lc_era.h" #include "lc_era.h"
#include "lc_collelem.h" #include "lc_collelem.h"
#include "lc_def_codesets.h"
#define _LC(x) &lc_##x##_ptr,lc_##x##_end-lc_##x##_ptr #define _LC(x) &lc_##x##_ptr,lc_##x##_end-lc_##x##_ptr
@ -474,7 +475,8 @@ __set_lc_time_from_win (const char *name,
locale. */ locale. */
lc_era_t locale_key = { locale, NULL, NULL, NULL, NULL, NULL , lc_era_t locale_key = { locale, NULL, NULL, NULL, NULL, NULL ,
NULL, NULL, NULL, NULL, NULL }; NULL, NULL, NULL, NULL, NULL };
lc_era_t *era = (lc_era_t *) bsearch ((void *) &locale_key, (void *) lc_era, lc_era_t *era = (lc_era_t *) bsearch ((void *) &locale_key,
(void *) lc_era,
sizeof lc_era / sizeof *lc_era, sizeof lc_era / sizeof *lc_era,
sizeof *lc_era, locale_cmp); sizeof *lc_era, locale_cmp);
@ -1455,34 +1457,42 @@ strxfrm (char *__restrict s1, const char *__restrict s2, size_t sn)
/* Fetch default ANSI codepage from locale info and generate a setlocale /* Fetch default ANSI codepage from locale info and generate a setlocale
compatible character set code. Called from newlib's setlocale(), if the compatible character set code. Called from newlib's setlocale(), if the
charset isn't given explicitely in the POSIX compatible locale specifier. */ charset isn't given explicitely in the POSIX compatible locale specifier. */
/* FIXME: Check all locales against their Linux counterpart again and
make sure the codeset conversion is correct.
FIXME: Perhaps, convert to locale names only.
FIXME: Perhaps, maintain a sorted list of Linux locales and their
default codesets. */
extern "C" void extern "C" void
__set_charset_from_locale (const char *locale, char *charset) __set_charset_from_locale (const char *loc, char *charset)
{ {
UINT cp;
wchar_t win_locale[ENCODING_LEN + 1]; wchar_t win_locale[ENCODING_LEN + 1];
char locale[ENCODING_LEN + 1];
const char *modifier;
char *c;
UINT cp;
int ret = __get_rfc5646_from_locale (locale, win_locale); /* Cut out explicit codeset */
wchar_t wbuf[9]; stpcpy (locale, loc);
modifier = strchr (loc, '@');
if ((c = strchr (locale, '.')))
stpcpy (c, modifier ?: "");
default_codeset_t srch_dc = { locale, NULL };
default_codeset_t *dc = (default_codeset_t *)
bsearch ((void *) &srch_dc, (void *) default_codeset,
sizeof default_codeset / sizeof *default_codeset,
sizeof *default_codeset, locale_cmp);
if (dc)
{
stpcpy (charset, dc->codeset);
return;
}
/* "C" locale, or invalid locale? */ /* "C" locale, or invalid locale? */
if (ret <= 0) if (__get_rfc5646_from_locale (locale, win_locale) <= 0)
cp = 20127; cp = 20127;
else if (!GetLocaleInfoEx (win_locale, else if (GetLocaleInfoEx (win_locale,
LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER, LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER,
(PWCHAR) &cp, sizeof cp)) (PWCHAR) &cp, sizeof cp))
cp = 0; cp = 0;
/* For simplicity, we still convert to LCID here. */
LCID lcid = LocaleNameToLCID (win_locale, 0);
/* Translate codepage and lcid to a charset closely aligned with the default /* Translate codepage and lcid to a charset closely aligned with the default
charsets defined in Glibc. */ charsets defined in Glibc. */
const char *cs; const char *cs;
const char *modifier = strchr (locale, '@') ?: "";
switch (cp) switch (cp)
{ {
case 20127: case 20127:
@ -1504,131 +1514,33 @@ __set_charset_from_locale (const char *locale, char *charset)
cs = "BIG5"; cs = "BIG5";
break; break;
case 1250: case 1250:
if (lcid == 0x181a /* sr_BA (Serbian/Bosnia cs = "ISO-8859-2";
and Herzegovina) */
|| lcid == 0x241a /* sr_RS (Serbian/Serbia) */
|| lcid == 0x2c1a /* sr_ME (Serbian/Montenegro)*/
|| lcid == 0x0442 /* tk_TM (Turkmen/Turkmenistan) */
|| !wcscmp (win_locale, L"sr-Latn-XK")) /* (Serbian/Kosovo) */
cs = "UTF-8";
else if (lcid == 0x041c) /* sq_AL (Albanian/Albania) */
cs = "ISO-8859-1";
else
cs = "ISO-8859-2";
break; break;
case 1251: case 1251:
if (lcid == 0x1c1a /* sr_BA (Serbian Language/Bosnia cs = "ISO-8859-5";
and Herzegovina) */
|| lcid == 0x281a /* sr_RS (Serbian Language/Serbia) */
|| lcid == 0x301a /* sr_ME (Serbian Language/Montenegro)*/
|| lcid == 0x0440 /* ky_KG (Kyrgyz/Kyrgyzstan) */
|| lcid == 0x082c /* az_AZ@cyrillic (Azerbaijani/Azerbaijan) */
|| lcid == 0x0843 /* uz_UZ (Uzbek/Uzbekistan) */
/* tt_RU (Tatar/Russia),
IQTElif alphabet */
|| (lcid == 0x0444 && has_modifier ("@iqtelif"))
|| lcid == 0x0450 /* mn_MN (Mongolian/Mongolia) */
|| !wcscmp (win_locale, L"sr-Cyrl-XK")) /* (Serbian/Kosovo) */
cs = "UTF-8";
else if (lcid == 0x0423) /* be_BY (Belarusian/Belarus) */
cs = has_modifier ("@latin") ? "UTF-8" : "CP1251";
else if (lcid == 0x0402 /* bg_BG (Bulgarian/Bulgaria) */
|| lcid == 0x0423) /* be_BY (Belarusian/Belarus) */
cs = "CP1251";
else if (lcid == 0x0422 /* uk_UA (Ukrainian/Ukraine) */
|| !wcscmp (win_locale, L"ru-UA")) /* (Russian/Ukraine) */
cs = "KOI8-U";
else if (lcid == 0x0428) /* tg_TJ (Tajik/Tajikistan) */
cs = "KOI8-T";
else
cs = "ISO-8859-5";
break; break;
case 1252: case 1252:
if (lcid == 0x0452) /* cy_GB (Welsh/Great Britain) */ cs = "ISO-8859-1";
cs = "ISO-8859-14";
else if (lcid == 0x4009 /* en_IN (English/India) */
|| lcid == 0x0867 /* ff_SN (Fulah/Senegal) */
|| lcid == 0x0464 /* fil_PH (Filipino/Philippines) */
|| lcid == 0x0462 /* fy_NL (Frisian/Netherlands) */
|| lcid == 0x0468 /* ha_NG (Hausa/Nigeria) */
|| lcid == 0x0475 /* haw_US (Hawaiian/United States) */
|| lcid == 0x0470 /* ig_NG (Igbo/Nigeria) */
|| lcid == 0x085d /* iu_CA (Inuktitut/Canada) */
|| lcid == 0x046c /* nso_ZA (Northern Sotho/South Africa) */
|| lcid == 0x0487 /* rw_RW (Kinyarwanda/Rwanda) */
|| lcid == 0x043b /* se_NO (Northern Saami/Norway) */
|| lcid == 0x0832 /* tn_BW (Tswana/Botswana) */
|| lcid == 0x0432 /* tn_ZA (Tswana/South Africa) */
|| lcid == 0x0488 /* wo_SN (Wolof/Senegal) */
|| lcid == 0x046a /* yo_NG (Yoruba/Nigeria) */
|| lcid == 0x085f) /* ber_DZ (Tamazight/Algeria) */
cs = "UTF-8";
else if (lcid == 0x042e) /* hsb_DE (Upper Sorbian/Germany) */
cs = "ISO-8859-2";
else if (lcid == 0x0491 /* gd_GB (Scots Gaelic/Great Britain) */
|| (has_modifier ("@euro")
&& GetLocaleInfoW (lcid, LOCALE_SINTLSYMBOL, wbuf, 9)
&& !wcsncmp (wbuf, L"EUR", 3)))
cs = "ISO-8859-15";
else
cs = "ISO-8859-1";
break; break;
case 1253: case 1253:
cs = "ISO-8859-7"; cs = "ISO-8859-7";
break; break;
case 1254: case 1254:
if (lcid == 0x042c) /* az_AZ (Azeri/Azerbaijan) */ cs = "ISO-8859-9";
cs = "UTF-8";
else if (lcid == 0x0443) /* uz_UZ (Uzbek/Uzbekistan) */
cs = "ISO-8859-1";
else
cs = "ISO-8859-9";
break; break;
case 1255: case 1255:
cs = "ISO-8859-8"; cs = "ISO-8859-8";
break; break;
case 1256: case 1256:
if (lcid == 0x0429 /* fa_IR (Persian/Iran) */ cs = "ISO-8859-6";
|| lcid == 0x0846 /* pa_PK (Punjabi/Pakistan) */
|| lcid == 0x0859 /* sd_PK (Sindhi/Pakistan) */
|| lcid == 0x0480 /* ug_CN (Uyghur/China) */
|| lcid == 0x0420) /* ur_PK (Urdu/Pakistan) */
cs = "UTF-8";
else
cs = "ISO-8859-6";
break; break;
case 1257: case 1257:
if (lcid == 0x0425) /* et_EE (Estonian/Estonia) */ cs = "ISO-8859-13";
cs = "ISO-8859-15";
else
cs = "ISO-8859-13";
break; break;
case 1258: case 1258:
default: default:
if (lcid == 0x3c09 /* en_HK (English/Hong Kong) */ cs = "UTF-8";
|| lcid == 0x200c /* fr_RE (French/Réunion) */ break;
|| lcid == 0x240c /* fr_CD (French/Congo) */
|| lcid == 0x280c /* fr_SN (French/Senegal) */
|| lcid == 0x2c0c /* fr_CM (French/Cameroon) */
|| lcid == 0x300c /* fr_CI (French/Ivory Coast) */
|| lcid == 0x340c /* fr_ML (French/Mali) */
|| lcid == 0x380c /* fr_MA (French/Morocco) */
|| lcid == 0x3c0c /* fr_HT (French/Haiti) */
|| lcid == 0x0477 /* so_SO (Somali/Somali) */
|| lcid == 0x0430) /* st_ZA (Sotho/South Africa) */
cs = "ISO-8859-1";
else if (lcid == 0x818) /* ro_MD (Romanian/Moldovia) */
cs = "ISO-8859-2";
else if (lcid == 0x043a) /* mt_MT (Maltese/Malta) */
cs = "ISO-8859-3";
else if (lcid == 0x0481) /* mi_NZ (Maori/New Zealand) */
cs = "ISO-8859-13";
else if (lcid == 0x0437) /* ka_GE (Georgian/Georgia) */
cs = "GEORGIAN-PS";
else if (lcid == 0x043f) /* kk_KZ (Kazakh/Kazakhstan) */
cs = "PT154";
else
cs = "UTF-8";
} }
stpcpy (charset, cs); stpcpy (charset, cs);
} }