2011-05-17 110 views
1

有人能解釋爲什麼下面的比較不相等?ICU和字符串比較

void CompareTest() 
{ 
    UErrorCode status = U_ZERO_ERROR; 
    UChar ruleset[500]; *ruleset = 0; 
    int32_t rlen = 0; 

    UCollator *coll = ucol_open("de_DE", &status); 


    static const UChar rules[] = L"&\\u0000 = '' = '-'"; 
    int32_t len=(int32_t)u_strlen(rules); 

    const UChar *defRules = ucol_getRules(coll, &rlen); 
    if(rlen > 0) 
    { 
    u_strcpy(ruleset, defRules); 
    } 
    u_strcat(ruleset, rules); 

    status = U_ZERO_ERROR; 
    UCollator *collRule = ucol_openRules(ruleset, u_strlen(ruleset), UCOL_OFF,  UCOL_DEFAULT_STRENGTH,NULL, &status); 

    ucol_setAttribute(collRule, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); 
    ucol_setAttribute(collRule, UCOL_STRENGTH, UCOL_QUATERNARY, &status); 


    UCollationResult uResult = ucol_strcoll(collRule, L"post-war", -1, L"post war", -1); 
    uResult = ucol_strcoll(collRule, L"post-war", -1, L"postwar", -1); 
    uResult = ucol_strcoll(collRule, L"ÄÖÜ", -1, L"äöü", -1); 
    uResult = ucol_strcoll(collRule, L"ß", -1, L"ss", -1); 


} 

回答

2

你不需要做任何規則定製。

UCollator * collRule = coll; 
    ucol_setAttribute(collRule, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); // no effect for these samples. 
    ucol_setAttribute(collRule, UCOL_STRENGTH, UCOL_PRIMARY, &status); 
    ucol_setAttribute(collRule, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status); 

結果:

post-war -> [45 43 4B 4D 53 27 49 00] 
post war -> [45 43 4B 4D 53 27 49 00] 
(post-war === post war) -> 0 
post-war -> [45 43 4B 4D 53 27 49 00] 
postwar -> [45 43 4B 4D 53 27 49 00] 
(post-war === postwar) -> 0 
ÄÖÜ -> [27 43 4F 00] 
äöü -> [27 43 4F 00] 
(ÄÖÜ === äöü) -> 0 
ß -> [4B 4B 00] 
ss -> [4B 4B 00] 
(ß === ss) -> 0