2025年3月28日 星期五 甲辰(龙)年 月廿七 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 文件格式与编码

windows自带记事本导致文本文件(UTF-8编码)开头三个字符乱码问题

时间:01-02来源:作者:点击数:70

在windows平台下,使用系统的记事本以UTF-8编码格式存储了一个文本文件,但是由于Microsoft开发记事本的团队使用了一个非常怪异的行为来保存UTF-8编码的文件,它们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,所以我们就会遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报出语法错误,等等。

下面为一段测试程序,由记事本编辑的文本文件导致文件开头前三个字符乱码。

  • #include <stdio.h>
  • #define MAX_LEN 100
  • int main()
  • {
  • char strLine[MAX_LEN];
  • int i = 0;
  • memset(strLine,0x0,MAX_LEN);
  • FILE * fp;
  • fp = fopen("eng_query.txt","r");
  • if(NULL == fp)
  • {
  • printf("open file fail.\n");
  • return -1;
  • }
  • while(fgets(strLine,MAX_LEN,fp))
  • {
  • printf("str = %s",strLine);//将每行字符串打印出来
  • for(i=0; i<strlen(strLine); i++)//将每各字符串中的字符以十六进制格式打印出来
  • {
  • printf("%x ",strLine[i]);
  • }
  • printf("\n\n");
  • }
  • fclose(fp);
  • return 0;
  • }

输入文件:

  • tsinghua press
  • mp18
  • evaluating method for the double image
  • jiaoyuxvshi
  • balancing mechanism
  • hthr
  • amplification
  • bionic optimization algorithm
  • a r l
  • tcb

输出文件:

  • str = 锘縯singhua press
  • ffffffef ffffffbb ffffffbf 74 73 69 6e 67 68 75 61 20 70 72 65 73
  • 73 a
  • str = mp18
  • 6d 70 31 38 a
  • str = evaluating method for the double image
  • 65 76 61 6c 75 61 74 69 6e 67 20 6d 65 74 68 6f 64 20 66 6f
  • 72 20 74 68 65 20 64 6f 75 62 6c 65 20 69 6d 61 67 65 a
  • str = jiaoyuxvshi
  • 6a 69 61 6f 79 75 78 76 73 68 69 a
  • str = balancing mechanism
  • 62 61 6c 61 6e 63 69 6e 67 20 6d 65 63 68 61 6e 69 73 6d a
  • str = hthr
  • 68 74 68 72 a
  • str = amplification
  • 61 6d 70 6c 69 66 69 63 61 74 69 6f 6e a
  • str = bionic optimization algorithm
  • 62 69 6f 6e 69 63 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20
  • 61 6c 67 6f 72 69 74 68 6d a
  • str = a r l
  • 61 20 72 20 6c a
  • str = tcb
  • 74 63 62 a

我们可以发现文件开头三个字符乱码,每个汉字占用两个字符,因此第4个字符本来为‘t’,也只能乱码显示出来。

因此,可以使用Notepad++代替记事本。需要将Notepad++的默认编码设置为UTF-8 without BOM即可;

0
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门