【发布时间】:2011-09-24 18:10:48
【问题描述】:
首先,我使用 ANSI C(不是 C++ 和任何非标准库,如 MS CRT 或 glibc,...)开发了一个独立的平台库。
经过几次搜索,我发现在 ANSI C 中实现国际化的最佳方法之一是使用 UTF-8 编码。
在 utf-8 中:
- strlen(s):始终计算字节数。
- mbstowcs(NULL,s,0):字符数可以统计。
但是当我想随机访问 utf-8 字符串的元素(字符)时,我遇到了一些问题。
ASCII 编码:
char get_char(char* assci_str, int n)
{
// It is very FAST.
return assci_str[n];
}
在 UTF-16/32 编码中:
wchar_t get_char(wchar_t* wstr, int n)
{
// It is very FAST.
return wstr[n];
}
这里是我的 UTF-8 编码问题:
// What is the return type?
// Because sizeof(utf-8 char) is 8 or 16 or 24 or 32.
/*?*/ get_char(char* utf8str, int n)
{
// I can found Nth character of string by using for.
// But it is too slow.
// What is the best way?
}
谢谢。
【问题讨论】:
-
你有没有使用“Nth character”的例子?
-
mbstowcs不保证按照您的要求行事。这取决于您的语言环境设置,请参阅<locale.h>,并且通常与编码无关。如果您处理明确的编码,请使用iconv或类似的东西。 -
@R:
replace(char* str){for(...){...get_char(i)...} -
@Amir:你能循环指针而不是字符索引吗?例如,你可以这样做:for(p=str; *p!=NULL; move_one_char_forward(&p)) {...}
-
@Amir:ANSI C 不支持编码。您的问题明确要求使用 Unicode,因此只有两个答案是 a) 用 ANSI C 编写您自己的完整 Unicode 库,或 b) 采用现有的、极其广泛且流行的符合 POSIX 的库。