首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >迭代utf-8中的字符块。

迭代utf-8中的字符块。
EN

Stack Overflow用户
提问于 2013-06-16 13:45:49
回答 4查看 468关注 0票数 0

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

我看过重症监护室的项目,但我想不出我能不能做我想做的事。

我想这样做的结果是:

代码语言:javascript
运行
复制
for (unsignet int=UBLOCK_GREEK_EXTENDED; i<UBLOCK_GREEK_EXTENDED_SIZE; i++) {
    // do stuff
}

icu项目是一个非常强大的工具,所以我希望有人知道如何这样做:)

更新:我正在为移动设备的3D框架编写本地化选项。它可以对真实字体进行光栅化和编码,这样就可以通过从光栅化字体文件中选择所需的图像来轻松地呈现它们。因为我必须关心内存的数量,所以我想要为不同的语言(或语言,或字符块,如cirylic或希腊语)在不同的文件中分割出不同的字体,所以我不需要一直将整个utf-8字体保存在内存中,而只是在检测区域设置之后加载相应的文件。

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-06-16 19:08:16

因此,我最终资助了正确使用icu项目库http://site.icu-project.org的方法.

下面是一个示例解决方案。您可以指定地区或语言,并获得一个utf-8字符块数组,其中包含相对于区域/语言的符号。然后,您可以获得每个字符块的开始和结束。

代码语言:javascript
运行
复制
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“的结果:

与之相关的脚本代码数如下: 射程计数: 30 套餐尺寸: 1272 距离开始: 41 范围结束: 5a 距离开始: 61 范围结束: 7a ..。 范围启动: ff41 范围结束: ff5a

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

票数 1
EN

Stack Overflow用户

发布于 2013-06-16 14:01:50

我们不太清楚你的意思,因为尽管UTF地图中有专门针对某些语言的部分--比如你说的希腊语--有很多语言的字符被分割成若干不同的区域--例如,许多欧洲语言使用ASCII字母-- at等--还有从160-240区域设置的“ExtendedLatin1”中选择的字符。

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

如果您完全不是这个意思,而是希望从UTF中打印出特定的分组,我建议您考虑使用UTF32作为基本编码,这样打印字符就容易多了。

票数 0
EN

Stack Overflow用户

发布于 2013-06-16 15:01:29

语言块位于unicode 列在这里中的列表,因此您可以将字符的大部分字符拆分到自己的文件中。

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

但是,动态地这样做可能不是一个好主意,因为它可能很慢(检查每个字符),并且当字符在任何字符集中滑入时也容易失败。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17133963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档