#include #include #include #include #include char DefaultLocale[30]; const char* CharClasses[] = {"alnum", "cntrl", "ideogram", "print", "space", "xdigit", "alpha", "digit", "lower", "punct", "special", "blank", "graph", "phonogram","rune", "upper"}; const int CHAR_CLASS_SIZE = (sizeof(CharClasses) / sizeof(char*)); wctype_t CharClassValues[(sizeof(CharClasses) / sizeof(char*))]; void test_locale(wchar_t c, const char* locale) { setlocale(LC_ALL, locale); const char* localeSetting = setlocale(LC_ALL, NULL); printf("in %s locale, iswprint(%#x) = %d\n", localeSetting, c, !!iswprint(c)); } void test_char(wchar_t c) { printf("Character %#x is in classes: ", c); for (int i=0; i< CHAR_CLASS_SIZE; i++) if (iswctype(c, CharClassValues[i])) printf("%s ", CharClasses[i]); printf("\n"); test_locale(c, DefaultLocale); test_locale(c, "en_US.UTF-8"); test_locale(c, "ja_JP.UTF-8"); printf("\n"); } int main() { const char* initial_locale = setlocale(LC_ALL, NULL); strncpy(DefaultLocale, initial_locale, 30); DefaultLocale[29] = '\0'; for (int i=0; i< CHAR_CLASS_SIZE; i++) { CharClassValues[i] = wctype(CharClasses[i]); printf("%s:%#lx, ", CharClasses[i], CharClassValues[i]); } printf("\nDefault Locale is: %s\n", DefaultLocale); test_char(L'\x64'); test_char(L'\u2002'); test_char(L'\uFF08'); test_char(L'\u2002'); test_char(L'\x82'); return 0; }