kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

C_TYPE検証プログラム

昨日のエントリはちょっとわかりづらかった(^^;。コメントどうもです>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も入れてみました。

*1:でも、printfのところ、どうもMBCSとUnicodeでうまくかけたためしがない…