全角字符大小写转换实现

在windows上应用层提供的字符串处理函数一般是不能够处理全角字符大小写问题的。例如,_wcsicmp()并不会认为全角字符A和全角字符a是相等的。又如,CString的方法LowerCase()也不能将全角的A转换为全角的a。遇到需要对全角字符进行大小写转换和大小写不敏感的比较的时候,我们需要用到windows提供的API函数LCMapString

函数原型是:

int LCMapString(
  LCID Locale,       
  DWORD dwMapFlags,  
  LPCTSTR lpSrcStr,  
  int cchSrc,        
  LPTSTR lpDestStr,  
  int cchDest  
);


具体细节可以参见MSDN的解释,我们这里的关键是设置参数dwMapFlags,需要用到的是LCMAP_LOWERCASE和LCMAP_UPPERCASE。具体用法参考后面的代码示例。

对于Unicode编码中大小写字母的编码对应规则可以参考Unicode联盟的网站http://www.unicode.org/,大小写编码对照表在http://www.unicode.org/faq/casemap_charprop.html处下载。

以下参考代码中的三个函数分别实现了字符串大小写转换和大小写不敏感比较

LPTSTR SbcStringLowercase(LPTSTR pSbcStr, int nLength)
{
	::LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_LOWERCASE, pSbcStr, nLength, pSbcStr, nLength);

	return pSbcStr;
}

LPTSTR SbcStringUppercase(LPTSTR pSbcStr, int nLength)
{
	::LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_UPPERCASE, pSbcStr, nLength, pSbcStr, nLength);

	return pSbcStr;
}

int SbcStringCompareNoCase(LPCTSTR pStr1, LPCTSTR pStr2)
{//创建两个临时字符串
	int ret = 0;
	UINT nLen1 = _tcsclen(pStr1);
	UINT nLen2 = _tcsclen(pStr2);

	TCHAR* pTempStr1 = new TCHAR[nLen1+1];
	TCHAR* pTempStr2 = new TCHAR[nLen2+1];

	memcpy(pTempStr1, pStr1, nLen1*sizeof(TCHAR));
	pTempStr1[nLen1] = 0;

	memcpy(pTempStr2, pStr2, nLen2*sizeof(TCHAR));
	pTempStr2[nLen2] = 0;

	SbcStringLowercase(pTempStr1, nLen1);
	SbcStringLowercase(pTempStr2, nLen2);

	ret = _tcsicmp(pTempStr1,  pTempStr2);

	delete[] pTempStr1;
	delete[] pTempStr2;

	return ret;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值