Ubuntu 16.04.6 LTS, g++ 5.4.0 では、次のように書くと期待通り
すべての結果が 1 になります。
コード:
#include <iostream>
int main()
{
std::setlocale(LC_CTYPE, "");
std::cout << iswprint(L'♪') << " " << iswgraph(L'♪') << std::endl;
std::cout << iswprint(L'√') << " " << iswgraph(L'√') << std::endl;
return 0;
}
ただし、setlocale を削除するか、あるいはそれと同等の
setlocale(LC_CTYPE, "C"); にすると、結果はすべて 0 になります。
Windows では、isw~ が期待通りに動かないようなので、
次のように GetStringTypeW を使って、isW~ を作ればよいでしょう。
コード:
#include <windows.h>
#include <iostream>
int isWprint(wchar_t wc)
{
WORD t;
GetStringTypeW(CT_CTYPE1, &wc, 1, &t);
return (t & C1_DEFINED) && !(t & C1_CNTRL);
}
int isWgraph(wchar_t wc)
{
WORD t;
GetStringTypeW(CT_CTYPE1, &wc, 1, &t);
return (t & C1_DEFINED) && !(t & C1_CNTRL) && !(t & C1_SPACE);
}
int main()
{
std::cout << isWprint(L'♪') << " " << isWgraph(L'♪') << std::endl;
std::cout << isWprint(L'√') << " " << isWgraph(L'√') << std::endl;
return 0;
}
GetStringTypeW の機能を調べるために次のようなプログラムを
書いてみました。
コード:
#include <windows.h> // GetStringTypeW
#include <stdio.h> // printf
#include <locale.h> // setlocale
void show(wchar_t wc)
{
static char *s[] = {
"upper", "lower", "digit", "space", "punct",
"cntrl", "blank", "xdigit", "alpha", "defined"
};
WORD t;
GetStringTypeW(CT_CTYPE1, &wc, 1, &t);
printf(" %04x '%lc' %02x [", wc, wc, t);
for (int i = 10; --i >= 0; )
if (t & 1<<i) printf(" %s", s[i]);
printf(" ]\n");
}
int main(void)
{
setlocale(LC_CTYPE, "");
show(L'\0');
show(L'A'); show(L'z'); show(L'9'); show(L' '); show(L':');
show(L'\a'); show(L'\t');
show(L'♪'); show(L'√'); show(L' '); show(L'ぁ'-1);
show(L'A'); show(L'z'); show(L'9'); show(L';');
}
GetStringTypeW は locale には影響されませんが、
printf で "%lc" を使うために setlocale を呼び出しています。
実行結果
コード:
0000 ' ' 220 [ defined cntrl ]
0041 'A' 381 [ defined alpha xdigit upper ]
007a 'z' 302 [ defined alpha lower ]
0039 '9' 284 [ defined xdigit digit ]
0020 ' ' 248 [ defined blank space ]
003a ':' 210 [ defined punct ]
0007 '' 220 [ defined cntrl ]
0009 ' ' 268 [ defined blank cntrl space ]
266a '♪' 200 [ defined ]
221a '√' 200 [ defined ]
3000 ' ' 248 [ defined blank space ]
3040 '' 00 [ ]
ff21 'A' 381 [ defined alpha xdigit upper ]
ff5a 'z' 302 [ defined alpha lower ]
ff19 '9' 284 [ defined xdigit digit ]
ff1b ';' 210 [ defined punct ]