1. 程式人生 > >手持兩把錕斤拷, 口中疾呼燙燙燙, 腳踏千朵屯屯屯, 笑看萬物鍩鍩鍩

手持兩把錕斤拷, 口中疾呼燙燙燙, 腳踏千朵屯屯屯, 笑看萬物鍩鍩鍩

錕斤拷的來歷 GBK與UTF-8   

Unicode和老編碼體系的轉化程序中,一定有一些字,用Unicode是沒法表示的,Unicode官方用了一個佔位符來表示這些文字,這就是:U+FFFD REPLACEMENT CHARACTER。

那麼U+FFFD的UTF-8編碼出來,恰恰是 "\xef\xbf\xbd"。假如這個"\xef\xbf\xbd",反覆屢次,例如 "\xef\xbf\xbd\xef\xbf\xbd",然後放到GBK/CP936/GB2312/GB18030的環境中顯示的話,一個漢字2個位元組,最終的後果就是:錕斤拷""錕(0xEFBF),斤(0xBDEF),拷(0xBFBD)


#include<stdio.h>  
int main()  
{  
    char *s = "\xef\xbf\xbd\xef\xbf\xbd";  
    printf("%s\n", s);  
    return 0;  
}  

燙燙燙的來歷 vc++:

在windows平臺下,ms的編譯器(也就是vc帶的那個)在 Debug 形式下,會把未初始化的棧記憶體全部填成 0xcc,用字串來看就是"燙燙燙燙燙燙燙",也就是說呈現了燙燙燙,趕忙反省初始化吧

#include<stdio.h>
int main()
{

    char* s;
    print(" %s\n",s);
    return 0;
}  

屯屯屯的來歷 VC:

同上,未初始化的堆記憶體全部填成0xcd,字串看就是"屯屯屯屯屯屯屯屯"。

#include<stdio.h>    
#include<malloc.h>    
int main()  
{  
    char *s;  
    s = (char *)malloc(16);  
    printf(" %s", s);  
    free(p);  
    return 0;  
}

鍩的來歷 VC HTML:

微軟在 UTF-8 檔案頭部加上了 EF BB BF BOM 標誌。在不支援 BOM 的環境下對其停止 UTF-8 解碼失掉"鍩"字。

#include<stdio.h>  
int main()  
{  
    char *s = "\xef\xbb";  
    printf("%s\n", s);  
    return 0;  
}