首页 文章

在ICU中获取正确的Collator设置

提问于
浏览
0

要求是能够对ASCII和Unicode字符串执行不区分大小写的操作 . 每个输入字符串使用 UTF-16LE 进行编码,并存储为 std::basic_string<u_int16_t> 数据类型 . 大多数建议指向ICU,所以我对它进行了尝试 .

我写了一个示例代码来尝试一些示例输入:

#include <iostream.h>
#include "unicode/coll.h"

using namespace icu;
using namespace std;

int main()
{
    UErrorCode success = U_ZERO_ERROR;
    Collator *collator = Collator::createInstance("UTF-16LE", success);
    collator->setStrength(Collator::PRIMARY);

    if (collator->compare("dinç", "DINÇ") == 0) {
        cout << "Strings are equal" << endl;
    } else {
        cout << "Strings are unequal" << endl;
    }
    return 0;
}

有问题的字符串有土耳其字符 . 从我读到的,字符串比较应该失败,因为 'i''I' 在字符集中是不同的,无论它们是大写还是小写 . 但他们被认为是平等的 .

几个问题:

  • 在将字符串送入ICU之前,字符串是否应采用UTF-16编码?那会解决问题吗?

  • 通常,哪些collator设置是支持UTF-16编码字符串的不区分大小写操作的理想选择?我读到当强度设置为PRIMARY和SECONDARY时,它会导致不区分大小写的比较 . 除此之外,还有什么我可能会失踪的东西吗?

谢谢!

1 回答

  • 1

    除此之外,还有什么我可能会失踪的东西吗?

    是!您的代码缺少土耳其语 .

    Unicode套管规则有点简单,直到你在那里获得土耳其语† . Turkish Is are messy . i 的大写形式是 İ ,而不是 II 的小写形式是 ı ,而不是 i ;并且该对 i / İ 表示与该对 ı / I 不同的字母 .

    这意味着对于不区分大小写的比较有两组不同的规则:一个是 i 等于 I (大多数语言环境),另一个是不同的(对于土耳其语和阿塞拜疆语语言环境) .

    要使用ICU获取土耳其语语言环境语义,您需要create a collator with a specific locale,在本例中为tr_TR语言环境 .


    †不仅土耳其语 . 有四种语言有奇怪的套管规则;从最不凌乱到地狱:土耳其语和阿塞拜疆语,立陶宛语,希腊语 .

相关问题