5

こんにちは、みんな!

トルコ語では、アルファベットの文字の1つは異なる動作をします。それは、I-と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++の経験がないので、これら2つの例に相当するC ++は何でしょうか?

4

1 に答える 1

5

でプログラミングしている場合は、スレッドをにWindows変更してからを使用するか、ロケールオブジェクトを作成してからを使用することができます。localeen_US_stricmpen_US_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 );

boostがオプションの場合、よりポータブルでC ++に適したソリューションは、boost::localeライブラリを使用することです

于 2012-10-30T19:33:23.263 に答える