0

我的任务是遍历与给定语言(区域设置)对应的所有 utf-8 字符代码。我想这并不容易,我必须遍历字符块(例如,“ru_RU”的整个西里尔字母)。我可以在 wiki 页面https://en.wikipedia.org/wiki/UTF-8上找到字符块,但我希望有比发明自己的自行车更好的方法。

我看过 icu-project ,但我不知道我是否能做我需要的。

我想要的结果是这样的:

for (unsignet int=UBLOCK_GREEK_EXTENDED; i<UBLOCK_GREEK_EXTENDED_SIZE; i++) {
    // do stuff
}

icu-project 是一个非常强大的工具,所以我希望有人知道如何做到这一点:)

更新: 我正在为移动设备的 3D 框架开发本地化选项。它对真字体进行光栅化和编码,因此可以通过从光栅化字体文件中选择所需的图像来轻松渲染它们。由于我必须关心内存量,我想为不同的语言环境(或语言,或像 cirylic 或希腊语的字符块)在不同的文件中拆分光栅化字体,所以我不必将整个 utf-8 字体保留在内存中一直,但只有在检测到语言环境后才加载相应的文件。

谢谢!

4

4 回答 4

1

所以,我终于资助了正确使用 icu-project 库http://site.icu-project.org的方法。

这是一个示例解决方案。您指定区域设置或语言,并获取包含与区域设置/语言相关的符号的 utf-8 字符块数组。然后,您可以获取每个字符块的开始和结束。

UErrorCode err = U_ZERO_ERROR;
const int32_t capacity = 10;
const char* shortname = NULL;
int32_t num, j;
int32_t strLength = 4;
UScriptCode script[10] = {USCRIPT_INVALID_CODE};
num = uscript_getCode("en", script, capacity, &err);
UnicodeString temp = UnicodeString("[", 1, US_INV);
UnicodeString pattern;
for(j=0; j<num; j++) {
    shortname = uscript_getShortName(script[j]);
    UnicodeString str(shortname, strLength, US_INV);
    temp.append("[:");
    temp.append(str);
    temp.append(":]+");
}
pattern = temp.remove(temp.length()-1,1);
pattern.append("]");

UnicodeSet cnvSet(pattern, err);
printf("Number of script code associated are : %d \n", num);
printf("Range count: %d\n", cnvSet.getRangeCount());
printf("Set size: %d\n", cnvSet.size());
for(int32_t i=0; i<cnvSet.getRangeCount(); i++) {
    printf("Range start: %x\n", cnvSet.getRangeStart(i));
    printf("Range end: %x\n", cnvSet.getRangeEnd(i));
}

此示例中语言“en”的结果:

相关的脚本代码数为:1

范围计数:30

套装尺寸:1272

范围开始:41

范围结束:5a

范围开始:61

范围结束:7a

...

范围开始:ff41

范围结束:ff5a

这意味着与拉丁语块相对应的所有字符范围。

于 2013-06-16T19:08:16.567 回答
0

虽然 UTF 映射中有专门针对某些语言的部分(例如,正如您对希腊语所说的那样),但您的意思并不完全清楚 - 有很多语言的字符被分成许多不同的区域 -例如,许多欧洲语言使用 ASCII 字母 - AZ 等 - 并且还从 160-240 区域中设置的“扩展拉丁语 1”中选择字符。

因此,任何“迭代”的工具都说罗马尼亚语必须首先确定罗马尼亚语是哪些字符,然后在 UTF 中识别它们,然后打印它们。

如果您根本不是这个意思,而是想从 UTF 打印出特定的分组,我建议您考虑使用 UTF32 作为基本编码,其中打印字符会容易得多。

于 2013-06-16T14:01:50.600 回答
0

此处列出了语言块在 unicode中的位置列表,因此您可以将字符的大部分字符拆分到它们自己的文件中。

您需要列出每个呈现的字体文件中可用的字符,然后为呈现的每个字符串中的字符加载适当的字体文件。

但是 - 动态执行此操作可能不是一个好主意,因为它可能很慢(检查每个字符)并且当字符滑入不在任何字符集中的字符时容易失败。

反过来可能会更好。当有人初始化您的引擎时,他们会列出您应该加载哪些语言块,并加载相应的文件。然后,当您渲染字符串时,只需删除当前不可用的任何字符。

于 2013-06-16T15:01:29.623 回答
0

语言中实际使用的字符可以在CLDR中定义的示例集中找到。

我不会构建一个复杂的 UnicodeSet,而是迭代u+0000…u+10fff并测试返回的脚本uscript_getScript (UChar32 codepoint, UErrorCode *err)- UnicodeSet 将在内部对您作为答案提供的示例代码执行相同的操作。

于 2013-06-22T02:05:41.067 回答