昨日のエントリはちょっとわかりづらかった(^^;。コメントどうもです>biacさん
さて、検証用のプログラムをさらっと書いてみました。Windows 2000とXP/2003では結果に差があります。UnicodeでもMBCSでもコンパイルできます*1。
#include <windows.h> void printType(WCHAR wChar, WORD wValue) { WORD wType[] = {C3_NONSPACING, C3_DIACRITIC, C3_VOWELMARK, C3_SYMBOL, C3_KATAKANA, C3_HIRAGANA, C3_HALFWIDTH, C3_FULLWIDTH,C3_IDEOGRAPH, C3_KASHIDA, C3_LEXICAL, C3_ALPHA,}; LPTSTR szDisplay[] = {TEXT("C3_NONSPACING"), TEXT("C3_DIACRITIC"), TEXT("C3_VOWELMARK"), TEXT("C3_SYMBOL"), TEXT("C3_KATAKANA"), TEXT("C3_HIRAGANA"), TEXT("C3_HALFWIDTH"), TEXT("C3_FULLWIDTH"),TEXT("C3_IDEOGRAPH"), TEXT("C3_KASHIDA"), TEXT("C3_LEXICAL"), TEXT("C3_ALPHA"), }; for(int i = 0;i<sizeof(wType) / sizeof(WORD);i++) { if((wType[i] & wValue) == wType[i]){ #ifdef _MBCS printf(TEXT("%s | "), szDisplay[i]); #else printf("%ls | ", szDisplay[i]); #endif } } } int _tmain(int argc, _TCHAR* argv[]) { LPWSTR lpszExample = L"ポーリング工具"; WORD wResult[20]; ZeroMemory(wResult, sizeof(wResult)); GetStringTypeW(CT_CTYPE3, lpszExample, lstrlenW(lpszExample), wResult); for(int i = 0;i < lstrlenW(lpszExample);i++) { printType(lpszExample[i], wResult[i]); printf("\n"); } return 0; }
C3_HIGHSURROGATEとC3_LOWSURROGATEも定義されているのですが、新しいWindows SDK/Visual Studioじゃないとないようなのでここではなし。新しいSDKを持っている人は試してみてください。これはVisual C++ .NET 2003で作りました。コメントでいただいたように、U+ff9fも入れてみました。