在 ICU 中获得正确的 Collator 设置
Getting the correct Collator setting in ICU
要求是能够对 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 编码?这样能解决问题吗?
一般来说,哪些整理器设置最适合支持对 UTF-16 编码字符串进行不区分大小写的操作?我读到当强度设置为 PRIMARY 和 SECONDARY 时,会导致不区分大小写的比较。除此之外,还有什么我可能遗漏的吗?
谢谢!
In addition to this, is there any thing else that I might be missing?
是的!您的代码缺少土耳其语。
Unicode 大小写规则有点简单,除非您在那里输入土耳其语†。 Turkish I
s are messy。 i
的大写形式是İ
,不是I
,I
的小写形式是ı
,不是i
; i
/İ
对表示与 ı
/I
.
对不同的字母
这意味着有两组不同的规则用于不区分大小写的比较:一组 i
等于 I
(大多数语言环境),另一组不同(对于土耳其语和阿塞拜疆语言环境)。
为了使用 ICU 获得土耳其语言环境语义,您需要 create a collator with a specific locale,在本例中为 tr_TR 语言环境。
† 不仅是土耳其语。有四种语言的大小写规则很奇怪;从最不凌乱到地狱般:土耳其语和阿塞拜疆语、立陶宛语、希腊语。
要求是能够对 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 编码?这样能解决问题吗?
一般来说,哪些整理器设置最适合支持对 UTF-16 编码字符串进行不区分大小写的操作?我读到当强度设置为 PRIMARY 和 SECONDARY 时,会导致不区分大小写的比较。除此之外,还有什么我可能遗漏的吗?
谢谢!
In addition to this, is there any thing else that I might be missing?
是的!您的代码缺少土耳其语。
Unicode 大小写规则有点简单,除非您在那里输入土耳其语†。 Turkish I
s are messy。 i
的大写形式是İ
,不是I
,I
的小写形式是ı
,不是i
; i
/İ
对表示与 ı
/I
.
这意味着有两组不同的规则用于不区分大小写的比较:一组 i
等于 I
(大多数语言环境),另一组不同(对于土耳其语和阿塞拜疆语言环境)。
为了使用 ICU 获得土耳其语言环境语义,您需要 create a collator with a specific locale,在本例中为 tr_TR 语言环境。
† 不仅是土耳其语。有四种语言的大小写规则很奇怪;从最不凌乱到地狱般:土耳其语和阿塞拜疆语、立陶宛语、希腊语。