*** chklocale.c Wed Oct 3 17:15:02 2007 --- chklocale.c.fix Wed Oct 3 16:36:26 2007 *************** *** 27,34 **** #include "mb/pg_wchar.h" - #if defined(HAVE_LANGINFO_H) && defined(CODESET) - /* * This table needs to recognize all the CODESET spellings for supported * backend encodings, as well as frontend-only encodings where possible --- 27,32 ---- *************** static const struct encoding_match encod *** 49,71 **** --- 47,73 ---- {PG_EUC_JP, "eucJP"}, {PG_EUC_JP, "IBM-eucJP"}, {PG_EUC_JP, "sdeckanji"}, + {PG_EUC_JP, "CP20932"}, {PG_EUC_CN, "EUC-CN"}, {PG_EUC_CN, "eucCN"}, {PG_EUC_CN, "IBM-eucCN"}, {PG_EUC_CN, "GB2312"}, {PG_EUC_CN, "dechanzi"}, + {PG_EUC_CN, "CP20936"}, {PG_EUC_KR, "EUC-KR"}, {PG_EUC_KR, "eucKR"}, {PG_EUC_KR, "IBM-eucKR"}, {PG_EUC_KR, "deckorean"}, {PG_EUC_KR, "5601"}, + {PG_EUC_KR, "CP51949"}, /* or 20949 ? */ {PG_EUC_TW, "EUC-TW"}, {PG_EUC_TW, "eucTW"}, {PG_EUC_TW, "IBM-eucTW"}, {PG_EUC_TW, "cns11643"}, + /* No codepage for EUC-TW ? */ {PG_UTF8, "UTF-8"}, {PG_UTF8, "utf8"}, *************** static const struct encoding_match encod *** 111,116 **** --- 113,119 ---- {PG_LATIN10, "iso885916"}, {PG_KOI8R, "KOI8-R"}, + {PG_KOI8R, "CP20866"}, {PG_WIN1252, "CP1252"}, {PG_WIN1253, "CP1253"}, *************** static const struct encoding_match encod *** 143,165 **** --- 146,197 ---- {PG_SJIS, "SJIS"}, {PG_SJIS, "PCK"}, + {PG_SJIS, "CP932"}, {PG_BIG5, "BIG5"}, {PG_BIG5, "BIG5HKSCS"}, + {PG_SJIS, "CP950"}, {PG_GBK, "GBK"}, + {PG_SJIS, "CP936"}, {PG_UHC, "UHC"}, {PG_JOHAB, "JOHAB"}, + {PG_JOHAB, "CP1361"}, {PG_GB18030, "GB18030"}, + {PG_GB18030, "CP54936"}, {PG_SHIFT_JIS_2004, "SJIS_2004"}, {PG_SQL_ASCII, NULL} /* end marker */ }; + #ifdef WIN32 + static char * + win32_langinfo(const char* ctype) + { + char *r; + char *codepage; + int ln; + + /* + * Locale format on Win32 is _. . + * For example, English_USA.1252. + */ + if (!ctype || (codepage = strrchr(ctype, '.')) == NULL) + return NULL; + codepage++; + ln = strlen(codepage); + r = malloc(ln + 3); + sprintf(r, "CP%s", codepage); + + return r; + } + #endif + + #if (defined(HAVE_LANGINFO_H) && defined(CODESET)) || defined(WIN32) /* * Given a setting for LC_CTYPE, return the Postgres ID of the associated *************** pg_get_encoding_from_locale(const char * *** 181,186 **** --- 213,219 ---- if (ctype) { char *save; + char *name; save = setlocale(LC_CTYPE, NULL); if (!save) *************** pg_get_encoding_from_locale(const char * *** 190,204 **** if (!save) return PG_SQL_ASCII; /* out of memory; unlikely */ ! if (!setlocale(LC_CTYPE, ctype)) { free(save); return PG_SQL_ASCII; /* bogus ctype passed in? */ } sys = nl_langinfo(CODESET); if (sys) sys = strdup(sys); setlocale(LC_CTYPE, save); free(save); --- 223,242 ---- if (!save) return PG_SQL_ASCII; /* out of memory; unlikely */ ! name = setlocale(LC_CTYPE, ctype); ! if (!name) { free(save); return PG_SQL_ASCII; /* bogus ctype passed in? */ } + #ifndef WIN32 sys = nl_langinfo(CODESET); if (sys) sys = strdup(sys); + #else + sys = win32_langinfo(name); + #endif setlocale(LC_CTYPE, save); free(save); *************** pg_get_encoding_from_locale(const char * *** 209,217 **** --- 247,259 ---- ctype = setlocale(LC_CTYPE, NULL); if (!ctype) return PG_SQL_ASCII; /* setlocale() broken? */ + #ifndef WIN32 sys = nl_langinfo(CODESET); if (sys) sys = strdup(sys); + #else + sys = win32_langinfo(ctype); + #endif } if (!sys) *************** pg_get_encoding_from_locale(const char * *** 268,274 **** return PG_SQL_ASCII; } ! #else /* !(HAVE_LANGINFO_H && CODESET) */ /* * stub if no platform support --- 310,316 ---- return PG_SQL_ASCII; } ! #else /* (HAVE_LANGINFO_H && CODESET) || WIN32 */ /* * stub if no platform support *************** pg_get_encoding_from_locale(const char * *** 279,282 **** return PG_SQL_ASCII; } ! #endif /* HAVE_LANGINFO_H && CODESET */ --- 321,324 ---- return PG_SQL_ASCII; } ! #endif /* (HAVE_LANGINFO_H && CODESET) || WIN32 */