所以,我终于资助了正确使用 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
这意味着与拉丁语块相对应的所有字符范围。