LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 965|回复: 5

UTF-8编码问题,请各位大侠帮忙解释一下

[复制链接]
发表于 2008-7-24 11:27:53 | 显示全部楼层 |阅读模式
我在一个文档中(test_iconv.txt)写入几个汉字(内容为:汉王科技)保存为UTF-8格式。然后写一个小程序并打印出每个字节的十六进制,程序如下:

#include <stdio.h>
#include <string.h>

main(char argc, char **argv)
{
  FILE *fp1;
  char buffer[2000];
  int ch, i;

  if (!(fp1 = fopen(argv[1], "r"))) {
    printf("File cannot be opened: argv[1]\n");
        exit(1);
  }

  i = 0;
  while ((ch = fgetc(fp1)) != EOF) {
    buffer[i++] = ch;
        printf("\n%x", ch);
        if (i > 1999) {
          printf("buffer not enough");
          exit(1);
        }
  }
  printf("\n%s\n", buffer);

  fclose(fp1);
}

程序输出的结果如下:

xueping@xp-dev:/opt/xp-dev/c-dev/example$ ./file3 test_iconv.txt

e6
b1
89
e7
8e
8b
e7
a7
91
e6
8a
80
a
汉王科技


在windows下用UltraEdit以十六进制格式打开test_iconv.txt显示的内容如下:
FF FE 49 6C 8B 73 D1 79 80 62 0A 00

为什么两边打印出来的内容不一样?各位大侠帮忙解释一下。
UTF-8一个汉字为两个字节,为什么在Linux下4个汉字打印出来12字节?

如果把test_iconv.txt保存为gb2312,两边提取的结果是一样的。
发表于 2008-7-24 12:25:36 | 显示全部楼层
这两个应该不是同一个文件吧。后一个看起来象utf16编码的文件。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-24 12:31:14 | 显示全部楼层
是同一个文件,一个在Linux用上面的代码读取的结果,后一个是在windows下用UltraEdit读取的结果。
回复 支持 反对

使用道具 举报

发表于 2008-7-24 12:58:18 | 显示全部楼层
FF FE 49 6C 8B 73 D1 79 80 62 0A 00

FF FE 明显是文件头,OA 00是 \r
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-24 14:03:40 | 显示全部楼层
Post by linux001;1878004
FF FE 明显是文件头,OA 00是 \r


用UltraEdit是有“FF FE”,但是在Linux下用Hex Editor打开内容和用以上的代码读取的内容一样;所以我觉得很奇怪搞不懂。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-24 17:18:59 | 显示全部楼层
找到问题了,UltraEdit是以Unicode格式打开utf-8格式的文件;如果把test_iconv.txt转换成UCS-2格式两边读取内容就一样了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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