utf-8格式之no bom和+bom
utf-8 編碼的文件可以分為no bom 和 bom兩種格式。
何謂bom?
"ef bb bf" 這三個字節就叫bom,bom的全稱叫做"byte order mard".在utf-8文件中常用bom來表明這個文件是utf-8文件,而bom的本意實在utf16中用來表示高低字節序列的。在字節流之前有 bom表示采用低字節序列(低字節在前面),而utf8不用考慮字節序列,所以其實有無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 的問題。
所以解決此問題最根本的方法就是在保存 utf8 編碼文件時,不要使用 bom。
微軟的記事本 word 等只能正確打開含bom的utf8文件,然后ultraedit卻恰恰相反,回把bomutf8文件 誤認為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(
{
using (textwriter output = new streamwriter(
{
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();
}
}



浙公網安備 33010602011771號