5

大家好!

在土耳其语中,其中一个字母具有不同的行为,它是 I -and i-。在英语中,I 和 i 是大写和小写。在土耳其语中,小写的 I 不是 i,而是ı

所以在土耳其语环境(即Windows)中,“DOMAIN.COM”和“domain.com”是不相等的。由于电子邮件传输和 DNS 完全是英文的,如果邮件地址包含大写的 I,可能会出现问题。

在 C# 中,我们可以使用InvariantCultureIgnoreCase标志来纠正这个问题:

        // Mock
        string localDomain = "domain.com";
        string mailAddress = "USER@DOMAIN.COM";
        string domainOfAddress = mailAddress.Split('@')[1];
        string localInbox = "";

        //
        // Local inbox check

        //Case insensitive method 
        bool ignoreCase = true; // Equal to StringComparison.CurrentCultureIgnoreCase
        if (System.String.Compare(localDomain, domainOfAddress, ignoreCase) == 0) 
        { 
           // This one fails in Turkish environment
           localInbox = mailAddress.Split('@')[0];
        }


        //Culture-safe version
        if (System.String.Compare(localDomain, domainOfAddress, StringComparison.InvariantCultureIgnoreCase) == 0)
        {
            // This one is the correct/universal method
            localInbox = mailAddress.Split('@')[0];
        }

由于我没有 C++ 经验,这两个示例的C++ 等价物是什么?

4

1 回答 1

5

If you are programming in Windows, you may change locale of your thread to en_US and then use _stricmp, or create a locale object for en_US and then use _stricmp_l:

setlocale( LC_CTYPE, "English" );
assert( _stricmp("DOMAIN", "domain") == 0 );

_locale_t l = _create_locale( LC_CTYPE, "English" );
assert( _stricmp_l("DOMAIN", "domain", l) == 0 );

If boost is an option for you, a more portable and C++ friendly solution is to use boost::locale library

于 2012-10-30T19:33:23.263 回答