“燙燙燙”與“錕斤拷”的原理


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

解釋一下為什么會是這兩個東西不是別的= =:

棍斤拷亂碼:

源於GBK字符集和Unicode字符集之間的轉換問題。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)。

燙燙燙亂碼:

在windows平台下,ms的編譯器(也就是vc帶的那個)在 Debug 模式下,會把未初始化的棧內存全部填成 0xcc,用字符串來看就是"燙燙燙燙燙燙燙",未初始化的堆內存全部填成0xcd,字符串看就是“屯屯屯屯屯屯屯屯”。也就是說出現了燙燙燙,趕緊檢查初始化吧。。。

 

錕斤拷

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)[1]  。

http://baike.baidu.com/link?url=GCoDM7HBIV_JcJfXzIU9p1Rx7r8Ns2w6jVoZwnhn9ZizxhNG7egrUWojSETDzxb74uZFeVGIBK_qZYgNTo7So_

鍩鍩鍩原理

 

BOM 是 Byte Order Mark 的縮寫。是UTF編碼方案里用於標識編碼的標准標記,在UTF-16里本來是FF FE,變成UTF-8就成了EF BB BF。這個標記是可選的,因為UTF8字節沒有順序,所以它可以被用來檢測一個字節流是否是UTF-8編碼的。

  • 鍩EFBB
  • 匡BFEF
  • 豢BBBF

 

 

出現這個問題肯定是你寫網頁的時候用了記事本 ,記事本在保存文件的時候把原本文件的編碼改了記事本會默認保存為UTF-8的編碼,而如果你原本網頁是GBK編碼的,就會出現亂碼~BOM就是把一個Unicode保留字符U+FEFF,按照文件存儲者的編碼方式編碼后,塞到文件內容的最前邊。這樣用不同的Unicode編碼去解析文件頭,就可以得知文件的編碼方式和大小端順序。結果就是文件頭部多出來了兩三個字節。

有了BOM所有的程序都必須為BOM作出修改,這無疑是一個“大折騰”的行為。所以一般不認為BOM是個好主意。BOM引發的問題,我能想起來兩個:

 

PHP無法指定header(因為有BOM相當於開啟輸出)
UNIX可執行腳本的Shabang標記(#!)不能識讀


任何時候都采用無BOM的UTF-8編碼的Unicode,絕對是一個引發麻煩最少的最實用策略。UTF-8是Unicode的最佳實踐,沒有之一。
必須指出的是,何棄療的微軟經常做出非要DOM不可的行為,最典型的例子就是那個記事本(存盤就加DOM)。所以任何時候,都千萬別偷懶用記事本編輯php。華語驕傲Notepad++是Windows下的不二之選。

 

燙燙燙屯屯屯

在Visual Studio中的Debug模式下,如果聲明一個變量,但是沒有初始化,微軟會給未初始化的內存復制為0xCC。給為初始化的內存賦0xCC是有原因的,0xCC其實是INT3中斷指令,所以如果在Debug模式下試圖去執行這塊未初始化的內存的話就會中斷程序。

但VS中調試器默認的字符集是MBCS,而在MBCS中0xCCCC正好就是中文中的“燙”,所以顯示出來就都是燙……

如果是用分配堆的內存,會初始化成0xCD,0xCDCD在MBCS字符集中就是屯……

錕斤拷則涉及unicode的字符集轉換問題,Unicode和老編碼體系的轉化過程中,肯定有一些字,用Unicode是沒法表示的,Unicode官方用了一個占位符來表示這些文字,這就是:U+FFFD REPLACEMENT CHARACTER。U+FFFD的UTF-8編碼是0xEFBFBD,如果重復多次形成:EFBFBDEFBFBDEFBFBD 這樣

在GBK/CP936/GB2312/GB18030的環境(都是中國標准惹的禍)中顯示的話,一個漢字2個字節,最終的結果就是:錕斤拷——錕(0xEFBF),斤(0xBDEF),拷(0xBFBD)……


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM