在程序員網(wǎng)站上經(jīng)抽叛撸看到一個(gè)段子(滿滿的都是淚扒ぁ)
手持兩把錕斤拷玉控,口中疾呼燙燙燙飞主。腳踏千朵屯屯屯,笑看萬物锘锘锘
解釋一下為什么會(huì)是這兩個(gè)東西不是別的= =:
棍斤拷亂碼:
源于GBK字符集和Unicode字符集之間的轉(zhuǎn)換問題。Unicode和老編碼體系的轉(zhuǎn)化過程中碌识,肯定有一些字碾篡,用Unicode是沒法表示的,Unicode官方用了一個(gè)占位符來表示這些文字筏餐,這就是:U+FFFD REPLACEMENT CHARACTER开泽。那么U+FFFD的UTF-8編碼出來,恰好是 '\xef\xbf\xbd'魁瞪。如果這個(gè)'\xef\xbf\xbd'穆律,重復(fù)多次,例如 '\xef\xbf\xbd\xef\xbf\xbd'导俘,然后放到GBK/CP936/GB2312/GB18030的環(huán)境中顯示的話峦耘,一個(gè)漢字2個(gè)字節(jié),最終的結(jié)果就是:錕斤拷——錕(0xEFBF)旅薄,斤(0xBDEF)辅髓,拷(0xBFBD)。
燙燙燙亂碼:
在windows平臺(tái)下少梁,ms的編譯器(也就是vc帶的那個(gè))在 Debug 模式下利朵,會(huì)把未初始化的棧內(nèi)存全部填成 0xcc,用字符串來看就是"燙燙燙燙燙燙燙"猎莲,未初始化的堆內(nèi)存全部填成0xcd绍弟,字符串看就是“屯屯屯屯屯屯屯屯”。也就是說出現(xiàn)了燙燙燙著洼,趕緊檢查初始化吧樟遣。。身笤。
锘锘锘原理
BOM 是 Byte Order Mark 的縮寫豹悬。是UTF編碼方案里用于標(biāo)識(shí)編碼的標(biāo)準(zhǔn)標(biāo)記,在UTF-16里本來是FF FE液荸,變成UTF-8就成了EF BB BF瞻佛。這個(gè)標(biāo)記是可選的,因?yàn)閁TF8字節(jié)沒有順序娇钱,所以它可以被用來檢測(cè)一個(gè)字節(jié)流是否是UTF-8編碼的伤柄。
锘EFBB
匡BFEF
豢BBBF
燙燙燙屯屯屯
在Visual Studio中的Debug模式下,如果聲明一個(gè)變量文搂,但是沒有初始化适刀,微軟會(huì)給未初始化的內(nèi)存復(fù)制為0xCC。給為初始化的內(nèi)存賦0xCC是有原因的煤蹭,0xCC其實(shí)是INT3中斷指令笔喉,所以如果在Debug模式下試圖去執(zhí)行這塊未初始化的內(nèi)存的話就會(huì)中斷程序取视。
但VS中調(diào)試器默認(rèn)的字符集是MBCS,而在MBCS中0xCCCC正好就是中文中的“燙”常挚,所以顯示出來就都是燙……
如果是用分配堆的內(nèi)存作谭,會(huì)初始化成0xCD,0xCDCD在MBCS字符集中就是屯……
錕斤拷則涉及unicode的字符集轉(zhuǎn)換問題奄毡,Unicode和老編碼體系的轉(zhuǎn)化過程中折欠,肯定有一些字,用Unicode是沒法表示的秧倾,Unicode官方用了一個(gè)占位符來表示這些文字怨酝,這就是:U+FFFD REPLACEMENT CHARACTER。U+FFFD的UTF-8編碼是0xEFBFBD那先,如果重復(fù)多次形成:EFBFBDEFBFBDEFBFBD 這樣
在GBK/CP936/GB2312/GB18030的環(huán)境(都是中國(guó)標(biāo)準(zhǔn)惹的禍)中顯示的話农猬,一個(gè)漢字2個(gè)字節(jié),最終的結(jié)果就是:錕斤拷——錕(0xEFBF)售淡,斤(0xBDEF)斤葱,拷(0xBFBD)……