https://www.cnblogs.com/zhongru_tu/archive/2008/04/11/1147792.html
UTF-8 編碼的文件可以分為no BOM 和 BOM兩種格式划栓。
何謂BOM? "EF BB BF" 這三個字節(jié)就叫BOM,BOM的全稱叫做"Byte Order Mard".在utf-8文件中常用BOM來表明這個文件是UTF-8文件,而BOM的本意實在utf16中用來表示高低字節(jié)序列的掩蛤。在字節(jié)流之前有BOM表示采用低字節(jié)序列(低字節(jié)在前面)心傀,而utf8不用考慮字節(jié)序列,所以其實有無BOM都可以。UTF-8以字節(jié)為編碼單元兽叮,沒有字節(jié)序的問題萄喳。UTF-16以兩個字節(jié)為編碼單元卒稳,在解釋一個UTF-16文本前,首先要弄清楚每個編碼單元的字節(jié)序他巨。例如收到一個“奎”的Unicode編碼是594E充坑,“乙”的Unicode編碼是4E59。如果我們收到UTF-16字節(jié)流“594E”染突,那么這是 “奎”還是“乙”捻爷?
如果文件保存時,選擇了使用 BOM觉痛,那么就可能會出現(xiàn) headers already sent 的問題役衡。
因為 Web 服務(wù)器軟件可能不認識 BOM,所以就把 BOM 的兩個特殊字節(jié)當做字符發(fā)送給瀏覽器了薪棒。
這時再調(diào)用 session_start() 等函數(shù)手蝎,就會出現(xiàn) headers already sent 的問題榕莺。
所以解決此問題最根本的方法就是在保存 UTF8 編碼文件時,不要使用 BOM棵介。
微軟的記事本 Word 等只能正確打開含BOM的UTF8文件钉鸯,然后UltraEdit卻恰恰相反,回把BOMutf8文件 誤認為ascii編碼邮辽。
UTF-8的BOM是 EFBBBF唠雕,因為UE載入UTF-8文件會轉(zhuǎn)成Utf16,上述的EFBBBF 在Utf16中是FFFE(Unicode-LE的BOM)吨述,UltraEdit不認識BOM又加多一個BOM岩睁,所以有2個FFFE。文件就被它破壞了揣云。
當應(yīng)用程序的文件使用 UTF8 編碼時捕儒,在保存文件時,一定要注意 BOM 的問題邓夕。
那么如何將UTF8 without BOM轉(zhuǎn)換成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];
intlen;
while?((len?=?input.Read(buffer,?0,?i))?>?0)
{
output.Write(buffer,
0,?len);
}
input.Close();
}
}