曲径通幽论坛

标题: 读取 utf-8 中文文档测试 [打印本页]

作者: beyes    时间: 2009-7-8 01:54
标题: 读取 utf-8 中文文档测试
utf-8 存储中文用 3个字节,有一段中文文档:
人生
的价值
即以其人对于当代所做的工作为尺度。 —— 徐玮

测试读代码
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>

int main()
{
    FILE *stream;
    char mingyan[1000];
    char *p = mingyan;
    stream = fopen("my.txt", "r");
    if (stream == NULL){
        perror("errno");
        exit(1);
    }

         fread(p, 24, 1, stream);
        mingyan[24] = '\0';

    printf("%s\n", mingyan);
    printf("%c", mingyan[6]);

    return 0;
}
发现输出 mingyan[6] 时,输出换行,证明 utf-8 的中文确实是 3 个字节组成。原来以为换行符也会是 3 个字节,但通过 gdb 调试发现,换行符仍然是 '\n' 一个字节。

注意:在测试时,在 while 里用 feof() 函数并不奏效。因为底下用了 fseek() 函数,这个函数一旦成功调用,则会清除掉 EOF 标志。所以,会造成程序无法结束。
作者: beyes    时间: 2009-7-8 05:45
一个完整的读取程序,读取完,并输出
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>

int main()
{
    fpos_t position;
    FILE *stream;
  
    char mingyan[1000];
    char *p = mingyan;
    stream = fopen("my.txt", "r");
    if (stream == NULL){
        perror("errno");
        exit(1);
    }

    while ( fread(p, 3, 1, stream) != 0 ) {
   
       while (*p != '\\n') {
         p += 3;
         fread(p, 3, 1, stream);
      }
       
       p++;
       *p = '\\0';
       printf("%s", mingyan);
       p = mingyan;
       fseek(stream, -2, SEEK_CUR);
    }

    fclose(stream);
    return 0;
}
说明
此段程序读取的是 UTF-8 编码的中文,所以一次读入 3 个字节。因为遇到换行符 '\\n' 时,此符号只占用一个字节,所以要进行文件指针的移动:
fseek(stream, -2, SEEK_CUR);




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2