Suppose you have a Unicode code unit wchar_t
and you want to know whether it represents a numeric digit.
If you have
the ICU library,
you can check if its code point's u_charType
is
U_DECIMAL_DIGIT_NUMBER
.
But what about plain Win32?
For Win32, you can use the
GetStringTypeW
function to
obtain properties for each code unit.
bool IsUnicodeDigit(wchar_t ch) { WORD type; return GetStringTypeW(CT_CTYPE1, &ch, 1, &type) && (type & C1_DIGIT); }
We ask the GetStringTypeW
function
for the CT_
CTYPE1
value for one
character, passing an output buffer of size 1.
We then check whether the result says that it is a digit.
The GetStringTypeW
function
produces a 16-bit value for each provided code unit.
There are more than 16 things you can ask about,
so they are broken into groups, and you specify
which group you want.
Group 1 contains the basic classifications
that support POSIX functions
like isdigit
and isalnum
.
Here's one way it could be done. (I'm not saying this is how it actually is done.)
C runtime | Category flags | Win32 function |
---|---|---|
isalnum |
C1_ALPHA | C1_UPPER | C1_LOWER | |
IsCharAlphaNumeric sort of |
isalpha |
C1_ALPHA | C1_UPPER | C1_LOWER |
IsCharAlpha sort of |
isblank |
C1_BLANK |
|
iscntrl |
C1_CNTRL |
|
isdigit |
C1_DIGIT |
|
isgraph |
C1_ALPHA | C1_UPPER | C1_LOWER | |
|
islower |
C1_LOWER |
IsCharLower |
isprint |
C1_ALPHA | C1_UPPER | C1_LOWER | |
|
ispunct |
C1_PUNCT |
|
isspace |
C1_SPACE |
|
isupper |
C1_UPPER |
IsCharUpper |
isxdigit |
C1_XDIGIT |
Bonus reading: The difference between C1_SPACE-ing out and drawing a C1_BLANK.