忽略大小写比较两个单独的字符(char
或 UTF-16 s)的好方法是什么?wchar_t
一个简单的实现将是大写或小写。其中一种被认为更好,还是有其他方法?
我知道不可能对 Unicode 的所有细节进行完全正确的比较。该比较主要用于配置文件和微语法的一些基本解析,因此不需要完美。在每个字符比较的限制下,我正在寻找一个不太错误的实现。
[编辑]
这些配置文件可能包含向用户显示的文本。此外,在分析用户输入时,我无法避免 unicode 文本。
忽略大小写比较两个单独的字符(char
或 UTF-16 s)的好方法是什么?wchar_t
一个简单的实现将是大写或小写。其中一种被认为更好,还是有其他方法?
我知道不可能对 Unicode 的所有细节进行完全正确的比较。该比较主要用于配置文件和微语法的一些基本解析,因此不需要完美。在每个字符比较的限制下,我正在寻找一个不太错误的实现。
[编辑]
这些配置文件可能包含向用户显示的文本。此外,在分析用户输入时,我无法避免 unicode 文本。
You need CompareStringEx. It takes wide chars and has a case-insensitive flag.
首先将它们转换为字符串,例如创建一个包含两个 TCHAR 的数组,将 TCHAR 复制到第一个并将第二个设置为 _T('\0')。然后调用 lstrcmpi 或 CompareString。根据您的需求,这两种方法可能都不够,但它们是一个好的开始。例如,如果你想大写 ß,或者如果用户使用土耳其语并且你想大写 i,那么自己做比你想象的要难。
如果您打算将自己限制为英语 (ASCII) 关键字,那么有一种简单的方法可以进行比较。如果您想在关键字中使用 AZ 以外的字母,这并不能一概而论,但它对 AZ 非常有效。
如果您保证传递给此函数的值之一将是一个已知的良好关键字字符串,该字符串仅包含 ASCII 范围 32-127(AZ、az、0-9、大多数符号)中的可见字符,那么您可以执行简单的位掩码将小写转换为大写。
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;
}
此代码不是通用字符串比较,它专门用于将已知好的关键字与输入字符串进行比较。它将 {} 视为 [] 的大写,` 视为大写 @,~ 视为大写 ^,但如果保证此函数的输入之一不包含这些字符,则无关紧要。
它应该像这样使用
if (IsKeywordMatch(pszInput, "value"))
Don't use Unicode for config files if you want ASCII based case-insensitive comparison. Use ASCII for those files. Then you don't have to worry about locales.