UTF-8与UTF-8 without BOM
UTF-8編碼的文件可以分為without BOM和BOM兩種格式。
何謂BOM? “EF BB BF” 這三個字節就叫BOM,BOM的全稱叫做"Byte Order Mark". 在UTF-8文件中常用BOM來表明這個文件是UTF-8文件, 而BOM的本意是在UTF-16中用來表示高低字節序列的。在字節流之前有BOM表示采用低字節序列(低字節在前面),而UTF-8不用考慮字節序列,所以其實有無BOM都可以。UTF-8以字節為編碼單元,沒有字節序的問題。UTF-16以兩個字節為編碼單元,在解釋一個UTF-16文本前,首先要弄清楚每個編碼單元的字節序。例如收到一個“奎”的Unicode編碼是594E,“乙”的Unicode編碼是4E59。如果我們收到UTF-16字節流“594E”,那么這是 “奎”還是“乙”?
如果文件保存時,選擇了使用BOM,那么就可能會出現headers already sent的問題。
因為Web服務器軟件可能不認識BOM,所以就把BOM的兩個特殊字節當做字符發送給瀏覽器了。
這時再調用session_start()等函數,就會出現headers already sent的問題。
所以解決此問題最根本的方法就是在保存UTF-8編碼的文件時,不要使用BOM。
微軟的記事本Word等只能正確打開含BOM的UTF8文件,然而UltraEdit卻恰恰相反,會把BOM UTF-8文件誤認為ascii編碼。
UTF-8的BOM是 EFBBBF,因為UE載入UTF-8文件會轉成Utf16,上述的EFBBBF 在Utf16中是FFFE(Unicode-LE的BOM),UltraEdit不認識BOM又加多一個BOM,所以有2個FFFE。文件就被它破壞了。
當應用程序的文件使用 UTF8 編碼時,在保存文件時,一定要注意 BOM 的問題。那么如何將UTF8 without BOM轉換成UTF8呢?
using (TextReader input = new StreamReader(new FileStream(@"C:\Test.properties", FileMode.Open), Encoding.UTF8)) {using (TextWriter output = new StreamWriter(new FileStream(@"C:\Test2.lmx", FileMode.Create), Encoding.UTF8)){int BufferSize = 8096;char[] buffer = new char[i];int len;while ((len = input.Read(buffer, 0, i)) > 0){output.Write(buffer, 0, len);}input.Close();} }http://www.cnblogs.com/zhongru_tu/archive/2008/04/11/1147792.html
因為文本是有編碼的,比如中文有常用的GBK編碼,日文有Shift_JIS編碼,如果沒有歷史遺留問題,強烈建議使用標準的UTF-8編碼,所有語言使用同一種編碼,既沒有沖突,又被所有平臺所支持。
使用Windows的童鞋要特別注意:
千萬不要使用Windows自帶的記事本編輯任何文本文件。原因是Microsoft開發記事本的團隊使用了一個非常弱智的行為來保存UTF-8編碼的文件,他們自作聰明地在每個文件開頭添加了0xefbbbf(十六進制)的字符,你會遇到很多不可思議的問題,比如,網頁第一行可能會顯示一個“?”,明明正確的程序一編譯就報語法錯誤,等等,都是由記事本的弱智行為帶來的。建議你下載Notepad++代替記事本,不但功能強大,而且免費!記得把Notepad++的默認編碼設置為UTF-8 without BOM即可
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743256916071d599b3aed534aaab22a0db6c4e07fd0000
總結
以上是生活随笔為你收集整理的UTF-8与UTF-8 without BOM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三人成虎
- 下一篇: 存量之争:国美零售以全零售探索破局之道