標籤:
在windows平台下,使用系統的記事本以UTF-8編碼格式儲存了一個文字檔,但是由於Microsoft開發記事本的團隊使用了一個非常怪異的行為來儲存UTF-8編碼的檔案,它們自作聰明地在每個檔案開頭添加了0xefbbbf(十六進位)的字元,所以我們就會遇到很多不可思議的問題,比如,網頁第一行可能會顯示一個“?”,明明正確的程式一編譯就報出語法錯誤,等等。
下面為一段測試程式,由記事本編輯的文字檔導致檔案開頭前三個字元亂碼。
#include <stdio.h>#define MAX_LEN 100int 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 pressmp18evaluating method for the double imagejiaoyuxvshibalancing mechanismhthramplificationbionic optimization algorithma r ltcb
輸出檔案:
str = 鍩縯singhua pressffffffef ffffffbb ffffffbf 74 73 69 6e 67 68 75 61 20 70 72 65 73 73 astr = mp186d 70 31 38 astr = evaluating method for the double image65 76 61 6c 75 61 74 69 6e 67 20 6d 65 74 68 6f 64 20 66 6f72 20 74 68 65 20 64 6f 75 62 6c 65 20 69 6d 61 67 65 astr = jiaoyuxvshi6a 69 61 6f 79 75 78 76 73 68 69 astr = balancing mechanism62 61 6c 61 6e 63 69 6e 67 20 6d 65 63 68 61 6e 69 73 6d astr = hthr68 74 68 72 astr = amplification61 6d 70 6c 69 66 69 63 61 74 69 6f 6e astr = bionic optimization algorithm62 69 6f 6e 69 63 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2061 6c 67 6f 72 69 74 68 6d astr = a r l61 20 72 20 6c astr = tcb74 63 62 a
我們可以發現檔案開頭三個字元亂碼,每個漢字佔用兩個字元,因此第4個字元本來為‘t’,也只能亂碼顯示出來。
因此,可以使用Notepad++代替記事本。需要將Notepad++的預設編碼設定為UTF-8 without BOM即可;
windows內建記事本導致文字檔(UTF-8編碼)開頭三個字元亂碼問題