加入文件是utf-8编码,内容如下:
我是来自上海的互联网程序员,主要从事Web/游戏/手机服务器开发.
下面C代码可以一个一个的读入这些中文字符():
#define UTF8_CHAR_LEN( byte ) ((( 0xE5000000 >> (( byte >> 3 ) & 0x1e )) & 3 ) + 1)
char content[255]; //一行一行的读入文件,255的话大概满足需求了;这个代码片段也只是测试用.
FILE *data_file = fopen("path/to/file", "r");
if (!data_file) {
fprintf(stderr, "error happened when read file: %s","path/to/file");
return -1;
}
fgets(content, 255, data_file);
int i;
for (i = 0; content[i] != '\0'; i++) {
int utf8_char_len = UTF8_CHAR_LEN(content[i]);
if (utf8_char_len > 1) {
char word[4]; // utf-8占位最大字节也就是4个字节
memcpy(word, (content + i), utf8_char_len);
i += utf8_char_len - 1;
printf("%s\t", word);
}
else {
printf("%c\t", content[i]);
}
}
fclose(data_file);
输入:
我 是 来 自 上 海 的 互 联 网 程 序 员 , 主 要 从事 W e b / 游 戏 / 手 机 服 务 器 开 发 .
这里我觉得主要问题是字符指针它不标识出编码字符的大小,如果单纯的用 (p + 1)的话会把编码混乱掉,所以要先判断字符编码的所占字节数,然后再 (p + sizeofword) 输出;
上面的代码满足我现在的需求,不过还有一些疑问;
utf-8编码的字符在Linux c 下面怎么处理的呢?一般模式我还在寻找,有机会帖在这里.
这里还帖一个用宽字符库遍历utf-8字符串的代码片段:
wchar_t wstr[] = L"你好";
// en_US.UTF-8 是我本地的locale
setlocale(LC_ALL, "en_US.UTF-8");
int i;
for (i = 9; i < wcslen(wstr); i++) {
wprintf(L"%lc\n", wstr[i]);
}