比较两个单独字符(char
或UTF-16 wchar_t
)忽略大小写的好方法是什么?
一个简单的实现将是上限或下限两者。其中一个被认为是更好的,还是有其他方法?
据我所知,Unicode的所有细节都无法进行完全正确的比较。这种比较主要用于配置文件和微语法的一些基本解析,因此不需要完美。我希望在每个字符比较的限制下实现一个不太错误的实现。
[编辑]
这些配置文件可能包含向用户显示的文本。此外,在分析用户输入时,我无法避免使用unicode文本。
答案 0 :(得分:2)
您需要CompareStringEx。它需要宽字符并且不区分大小写。
答案 1 :(得分:1)
首先将它们转换为字符串,例如,创建两个TCHAR的数组,将TCHAR复制到第一个,并将第二个设置为_T('\ 0')。然后调用lstrcmpi或CompareString。根据您的需要,这两者可能都不够,但它们是一个良好的开端。例如,如果你想要升级ß,或者如果用户正在使用土耳其语并且你想要提升我,那么自己做比你想象的更难。
答案 2 :(得分:0)
如果您希望基于ASCII的不区分大小写的比较,请不要将Unicode用于配置文件。对这些文件使用ASCII。然后你不必担心语言环境。
答案 3 :(得分:0)
如果您要限制自己使用英语(ASCII)关键字,那么可以通过一种简单的方式进行比较。如果你想在你的关键词中使用A-Z以外的字母,这并不是一般化的,但它对于A-Z来说效果很好。
如果您保证传递给此函数的值之一将是一个已知的良好关键字字符串,其中仅包含ASCII范围32-127(AZ,az,0-9,大多数符号)中的可见字符,那么您可以执行简单的bitmasking将低级转换为大写。
bool IsKeywordMatch(LPCTSTR psz, LPCTSTR pszKey)
{
while (pszKey[0])
{
if (psz[0] < 0x20)
return false;
if ((psz[0] & ~0x20) != (pszKey[0] & ~0x20))
return false;
++psz;
++pszKey;
}
return true;
}
此代码 NOT 是一个通用字符串比较,它专门用于将已知的良好关键字与输入字符串进行比较。它会将{}视为[]的大写,`大写@,〜大写为^,但如果保证此函数的其中一个输入不包含这些字符,则无关紧要。
它意味着像这样使用
if (IsKeywordMatch(pszInput, "value"))