昨日のWindows 7で文字列比較すると2は10よりも小さくできるよ - 新日々此何有哉を書いた後、「ASCIIは大丈夫。じゃあFullWidth(いわゆる全角)の10と2では」と思ってやってみました。
#define WINVER 0x602 #include <windows.h> #include <locale.h> LPCTSTR lpszCSTR[4] = {_T("ERROR"), _T("CSTR_LESS_THAN"), _T("CSTR_EQUAL"), _T("CSTR_GREATER_THAN"), }; TCHAR szNumString4[] = {_T("10")}; TCHAR szNumString5[] = {_T("2")}; int iCompareResult; _tsetlocale(LC_ALL, _T("")); iCompareResult = CompareStringEx(LOCALE_NAME_SYSTEM_DEFAULT, SORT_DIGITSASNUMBERS, szNumString4, -1, szNumString5, -1, NULL, NULL, 0); _tprintf(_T("CompareStringEx %s %s %s \n"), szNumString4, lpszCSTR[iCompareResult], szNumString5); iCompareResult = CompareStringEx(LOCALE_NAME_SYSTEM_DEFAULT, 0, szNumString4, -1, szNumString5, -1, NULL, NULL, 0); _tprintf(_T("CompareStringEx %s %s %s \n"), szNumString4, lpszCSTR[iCompareResult], szNumString5);
この結果はこうなりました。FullWidthでも同一視するNORM_IGNOREWIDTHというフラグもありますが、これを指定しなくてもよいようです。
CompareStringEx 10 CSTR_GREATER_THAN 2
CompareStringEx 10 CSTR_LESS_THAN 2
調子に乗って漢数字はどうかと思ってみると…
#define WINVER 0x602 #include <windows.h> #include <locale.h> TCHAR szNumString6[] = {_T("十")}; TCHAR szNumString7[] = {_T("二")}; int iCompareResult; _tsetlocale(LC_ALL, _T("")); iCompareResult = CompareStringEx(LOCALE_NAME_SYSTEM_DEFAULT, SORT_DIGITSASNUMBERS, szNumString6, -1, szNumString7, -1, NULL, NULL, 0); _tprintf(_T("CompareStringEx %s %s %s \n"), szNumString6, lpszCSTR[iCompareResult], szNumString7); iCompareResult = CompareStringEx(LOCALE_NAME_SYSTEM_DEFAULT, 0, szNumString6, -1, szNumString7, -1, NULL, NULL, 0); _tprintf(_T("CompareStringEx %s %s %s \n"), szNumString6, lpszCSTR[iCompareResult], szNumString7);
さすがにこちらはダメなようです。
CompareStringEx 十 CSTR_LESS_THAN 二
CompareStringEx 十 CSTR_LESS_THAN 二