在ICU中获取正确的排序规则设置
Getting the correct Collator setting in ICU
要求能够对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'
在字符集上是不同的,无论它们是大写还是小写。但他们被认为是平等的。
几个问题:
在将字符串输入ICU之前,是否应对其进行UTF-16编码?这能解决问题吗?
一般来说,哪些collator设置最适合支持对UTF-16编码字符串进行不区分大小写的操作?我读到,当强度设置为PRIMARY和SECONDARY时,会导致不区分大小写的比较。除此之外,还有什么我可能遗漏的吗?
谢谢!
除此之外,还有什么我可能遗漏的吗?
是的!您的代码缺少土耳其语。
Unicode的大小写规则有点简单,直到你有了土耳其语†。土耳其的I
很混乱。i
的大写形式是İ
,而不是I
,而I
的小写形式是ı
,而不是i
;并且对CCD_ 12/CCD_ 13表示与对ı
/CCD_。
这意味着有两组不同的不区分大小写的比较规则:一组i
等于I
(大多数地区),另一组不同(土耳其和阿塞拜疆地区)。
为了使用ICU获得土耳其语言环境语义,您需要创建一个具有特定语言环境的collator,在本例中为tr_tr语言环境。
&匕首;不仅仅是土耳其语。有四种语言具有奇怪的大小写规则;从最不杂乱到地狱般:土耳其语和阿塞拜疆语,立陶宛语,希腊语。
相关文章:
- 二叉排序树无法编译
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 此代码是否违反一个定义规则
- C++选择排序算法中的逻辑错误
- 使用C++程序合并排序没有得到正确的输出
- 计算排序向量的向量中唯一值的计数
- 排序算法c++
- C++内存模型中的确切规则阻止在获取操作之前重新排序
- 在 C++20 中对概念约束函数进行排序的规则是什么?
- 操作员的排序规则和副作用
- 在ICU中获取正确的排序规则设置
- ICU:创建不区分大小写的排序规则
- 为什么编译器不强制保留排序规则?
- C++模板形式化排序规则
- as-if规则是否防止编译器对全局/成员变量的访问重新排序
- c++ as-if规则是否允许存储区重新排序
- 按相反顺序排序。 "Don't repeat yourself"规则
- 类中成员声明重新排序的规则
- 根据字符串变量设置的规则进行排序
- SQLite 的不区分大小写的 UTF-8 字符串排序规则 (C/C++)