在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即可;