kkamegawa's weblog

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

じゃあ、CompareStringExでFullwidthの10と2はどう判定される?

昨日の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 二