曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5966|回复: 1
打印 上一主题 下一主题

读取 utf-8 中文文档测试

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2009-7-8 01:54:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 标志。所以,会造成程序无法结束。

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
沙发
 楼主| 发表于 2009-7-8 05:45:58 | 只看该作者
一个完整的读取程序,读取完,并输出
#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);
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-13 12:21 , Processed in 0.077155 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表