要求是能够对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时,它会导致不区分大小写的比较。除此之外,还有什么我可能会遗失的东西吗?
谢谢!
答案 0 :(得分:1)
除此之外,还有什么我可能会遗失的东西吗?
YES!您的代码缺少土耳其语。
Unicode套管规则有点简单,直到你在那里获得土耳其语†。 Turkish I
s are messy。 i
的大写形式为İ
,而非I
,I
的小写形式为ı
,而不是i
;对i
/ İ
表示与ı
/ I
对不同的字母。
这意味着对于不区分大小写的比较有两组不同的规则:一个i
等于I
(大多数语言环境),一个不同(土耳其语和阿塞拜疆语)区域设置)。
为了使用ICU获取土耳其语语言环境语义,您需要create a collator with a specific locale,在本例中为tr_TR语言环境。
†不仅土耳其语。有四种语言有奇怪的套管规则;从最不凌乱到地狱:土耳其语和阿塞拜疆语,立陶宛语,希腊语。