在ICU中获取正确的排序规则设置

Getting the correct Collator setting in ICU

本文关键字:排序 规则 设置 ICU 获取      更新时间:2023-10-16

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

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

#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'在字符集上是不同的,无论它们是大写还是小写。但他们被认为是平等的。

几个问题:

  1. 在将字符串输入ICU之前,是否应对其进行UTF-16编码?这能解决问题吗?

  2. 一般来说,哪些collator设置最适合支持对UTF-16编码字符串进行不区分大小写的操作?我读到,当强度设置为PRIMARY和SECONDARY时,会导致不区分大小写的比较。除此之外,还有什么我可能遗漏的吗?

谢谢!

除此之外,还有什么我可能遗漏的吗?

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

Unicode的大小写规则有点简单,直到你有了土耳其语†。土耳其的I很混乱。i的大写形式是İ,而不是I,而I的小写形式是ı,而不是i;并且对CCD_ 12/CCD_ 13表示与对ı/CCD_。

这意味着有两组不同的不区分大小写的比较规则:一组i等于I(大多数地区),另一组不同(土耳其和阿塞拜疆地区)。

为了使用ICU获得土耳其语言环境语义,您需要创建一个具有特定语言环境的collator,在本例中为tr_tr语言环境。


&匕首;不仅仅是土耳其语。有四种语言具有奇怪的大小写规则;从最不杂乱到地狱般:土耳其语和阿塞拜疆语,立陶宛语,希腊语。