轉自:http://www.cnblogs.com/zhbzz2007/p/4283194.html 在windows平臺下,使用系統的記事本以UTF-8編碼格式存儲了一個文本文件,但是由於Microsoft開發記事本的團隊使用了一個非常怪異的行為來保存UTF-8編碼的文件,它們自作聰明地在每個文件 ...
轉自:http://www.cnblogs.com/zhbzz2007/p/4283194.html
在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即可;