一開始個人echo 輸出字符亂碼,隨後我就設置已在在文件內看看能不能用header(
'Content-type: text/html; charset=utf-8'
);結果提示這一句
php
Namespace declaration statement has to be the very first statement in the script;html
意思是明明空間必須在第一行瀏覽器
在PHP文件中編寫有namespace 時候提示此錯誤,應該將 <?php 開始前面不能有語句,空行也不行。dom
若是是在含有<html>語言的混合php 文件裏面,且文件裏面至少有一個<?php ?>代碼段時候,只要用到namespace,該文件的首行必須以<?php開頭.編輯器
結果設置回來仍是不行,後來查資料才發現是BOM緣由網站
什麼是BOM?編碼
Unicode規範中的BOM
Unicode規範中有一個BOM的概念。BOM——Byte Order Mark,就是
字節序標記。在這裏找到一段關於BOM的說明:
在UCS 編碼中有一個叫作"ZERO WIDTH NO-BREAK SPACE"的字符,它的編碼是FEFF。而FFFE在UCS中是不存在的
字符,因此不該該出如今實際傳輸中。UCS規範建議咱們在傳輸
字節流前,先傳輸字符"ZERO WIDTH NO-BREAK SPACE"。這樣若是接收者收到FEFF,就代表這個字節流是Big-Endian的;若是收到FFFE,就代表這個字節流是
Little-Endian的。所以字符"ZERO WIDTH NO-BREAK SPACE"又被稱做BOM。
UTF-8不須要BOM來代表
字節順序,但能夠用BOM來代表編碼方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB BF。因此若是接收者收到以EF BB BF開頭的
字節流,就知道這是UTF-8編碼了。
Windows就是使用BOM來標記文本文件的編碼方式的。
另外unicode網站的FAQ-BOM詳細介紹了BOM。官方的天然權威,不過是英文的,看起來比較費勁。
UTF-8編碼的文件中,BOM佔三個字節。若是用記事本把一個文本文件另存爲UTF-8
編碼方式的話,用UE打開這個文件,切換到十六進制編輯狀態就能夠看到開頭的FFFE了。這是個標識UTF-8編碼文件的好辦法,軟件經過BOM來識別這個文件是不是UTF-8編碼,不少軟件還要求讀入的文件必須帶BOM。但是,仍是有不少軟件不能識別BOM。我在研究Firefox的時候就知道,在Firefox早期的版本里,擴展是不能有BOM的,不過Firefox 1.5之後的版本已經開始支持BOM了。現在又發現,PHP也不支持BOM。
PHP在設計時就沒有考慮BOM的問題,也就是說他不會忽略UTF-8編碼的文件開頭BOM的那三個字符。因爲必須在<?或者<?php後面的代碼纔會做爲PHP代碼執行,因此這三個字符將會直接輸出。若是插件的文件有這個問題,將會致使在後臺頁面裏激活或者不激活插件後顯示白屏,若是是模版文件有這個問題,將會致使這三個字符直接輸出,形成頁面上方有一個小空行。國外的英文插件和模版通常都是用的ASCⅡ碼的編碼方式,不會有BOM,只有國內的插件和模版會因爲做者的不知情形成問題。還有,你們修改模版的時候,因爲輸出頁面使用UTF-8編碼,那麼修改模版的時候若是有加入中文字符的話,必須把文件轉成UTF-8編碼才能正常顯示,這個時候若是所使用的
編輯器自動加上了BOM的話,將會形成在頁面上輸出這三個字符,顯示效果就要看瀏覽器了,通常是一個空行或是一個
亂碼。
後來用notepad ++設置把頁面轉換爲utf-8無dom 格式就行了;