很久以前網(wǎng)絡(luò )上就流傳了類(lèi)似這樣的信息:新建一個(gè)記事本文檔,輸入“聯(lián)通”,保存后退出,再打開(kāi)這個(gè)記事本文檔,發(fā)現“聯(lián)通”變成了奇怪的符號,然而如果輸入“移動(dòng)”則一切正常。類(lèi)似的還有輸入“男”正常,輸入“女”不正常等等。原來(lái)只是知道這是字符編碼的問(wèn)題,而且以為只是對中文支持的不好,今天仔細研究了一下,才發(fā)現這里面的玄機還挺有意思的。
首先我們看看字符的編碼方式,拿“Hello”來(lái)舉例:
| 編碼后 | 編碼標準 |
| 48 65 6C 6C 6F | ANSI |
| 48 00 65 00 6C 00 6C 00 6F 00 | 不帶信息頭的 Unicode (little-endian) |
| FF FE 48 00 65 00 6C 00 6C 00 6F 00 | 帶信息頭的 Unicode (little-endian) |
| 00 48 00 65 00 6C 00 6C 00 6F | 不帶信息頭的 Unicode (big-endian) |
| FE FF 00 48 00 65 00 6C 00 6C 00 6F | 帶信息頭的 Unicode (big-endian) |
| EF BB BF 48 65 6C 6C 6F | UTF-8(信息頭占3字節) |
| 2B 2F 76 38 2D 48 65 6C 6C 6F | UTF-7(信息頭占5字節) |
接下來(lái)我們看看記事本(Notepad),作為純文本編輯器,它支持4種格式,這些在“另存為”對話(huà)框的下面可以選擇:8-bit ANSI、UTF-8、Unicode(little-endian)、Unicode(big-endian)。其中 Unicode(little-endian)可以帶信息頭也可以不帶,Unicode(big-endian)必須帶信息頭。
當我們往記事本里輸入一段文字后直接保存(而沒(méi)有選擇特定格式)的時(shí)候,記事本會(huì )自動(dòng)選擇一種它認為最為合適的編碼方式進(jìn)行保存。但我們再次打開(kāi)這個(gè)文檔的時(shí)候,記事本需要判斷這個(gè)文檔使用的是的什么字符編碼,才能進(jìn)行解碼顯示。當文檔帶有信息頭時(shí),記事本不會(huì )判斷錯誤,否則,記事本需要對編碼方式進(jìn)行猜測(注意是猜測?。?。也就是說(shuō),UTF-8、帶信息頭的 Unicode (little-endian)、帶信息頭的 Unicode (big-endian),記事本都不會(huì )識別錯誤,剩下的兩種情況(ANSI 和不帶信息頭的 Unicode (little-endian))就需要進(jìn)行猜測了。猜測的方法是使用API函數 IsTextUnicode,對文檔前若干字節數據進(jìn)行統計分析,來(lái)判斷是否符合 Unicode 編碼標準,從而選擇最有可能的編碼方式。這樣,在文本數量很少(影響統計)時(shí),是可能出現判斷錯誤的情況的。
能出現這種現象的文本還是很多的,比如“Bush hid the facts”或者“ abc.bak abc.txt”(注意前面有個(gè)空格)等等。其實(shí)瀏覽網(wǎng)頁(yè)的時(shí)候也會(huì )出現類(lèi)似的問(wèn)題,因為IE也是通過(guò)這種方法顯示文本的,所以當網(wǎng)頁(yè)文字出現亂碼(指全部亂碼)的時(shí)候,手動(dòng)在查看-->編碼 里進(jìn)行選擇,有時(shí)會(huì )有意想不到的效果。
由于是字符編碼標準的問(wèn)題,而記事本又是一個(gè)純文本的編輯器,所以這不能算是的一個(gè) Bug,呵呵。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。