UTF-8和BOM的一些說明

BOM的含義php

  BOM即Byte Order Mark字節序標記。BOM是爲UTF-16和UTF-32準備的,用戶標記字節序(byte order)。拿UTF-16來舉例,其是以兩個字節爲編碼單元,在解釋一個UTF-16文本前,首先要弄清楚每一個編碼單元的字節序。例如收到一個「奎」的Unicode編碼是594E,「乙」的Unicode編碼是4E59。若是咱們收到UTF-16字節流"594E",那麼這是「奎」仍是「乙」?linux

  Unicode規範中推薦的標記字節順序的方法是BOM:在UCS編碼中有一個叫作"ZERO WIDTH NO-BREAK SPACE"(零寬度無間斷空間)的字符,它的編碼是FEFF。而FEFF在UCS中是不不能再的字符(即不可見),因此不該該出如今實際傳輸中。UCS規範建議咱們在傳輸字節流前,先傳輸字符"ZERO WIDTH NO-BREAK SPACE"。這樣若是接收者接收到FEFF,就代表這個字節流是Big-Endian的;若是收到FFFE,就代表這個字節流是Little-Endian的。所以字符"ZERO WIDTH NO-BREAK SPACE"又被稱爲BOM。vim

  UTF-8是以字節爲編碼單元,沒有字節序的問題windows


延伸一下:網絡

  UTF-8編碼是以1個字節爲單位進行處理的,不會受CPU大小端的影響;須要考慮下一位時就地址 + 1。less

  UTF-1六、UTF-32是以2個字節和4個字節爲單位進行處理的,即1次讀取2個字節或4個字節,這樣一來,在存儲和網絡傳輸時就要考慮1個單位內2個字節或4個字節之間順序的問題。ssh


 

UTF-8 BOM編碼

  UTF-8 BOM又叫UTF-8 簽名,UTF-8不須要BOM來代表字節順序,但能夠用BOM來代表編碼方式。當文本程序讀取到以 EF BB BF開頭的字節流時,就知道這是UTF-8編碼了。Windows就是使用BOM來標記文本文件的編碼方式的spa


補充:設計

"ZERO WIDTH NO-BREAK SPACE"字符的UCS編碼爲FEFF(假設爲大端),對應的UTF-8編碼爲 EF BB BF 


 

  即以EF BB BF開頭的字節流可代表這是段UTF-8編碼的字節流。但若是文件自己就是UTF-8編碼的,EF BB BF這三個字節就毫無用處了。 因此,能夠說BOM的存在對於UTF-8自己沒有任何做用

 

UTF-8文件中包含BOM的壞處

  一、對php的影響

  php在設計時就沒有考慮BOM的問題,也就是說他不會忽略UTF-8編碼的文件開頭的那三個EF BB BF字符,直接當作文本進行解析,致使解析錯誤。

  二、在linux上執行SQL腳本報錯


  最近開發過程當中遇到,windows下編寫的SQL文件,在linux下執行時,老是報錯。

  在文件的開頭,不管是使用中文註釋仍是英文註釋,甚至去掉註釋,也會報SP2-0734: unknown command beginning "?<span "="">dec<span "="">lare ..." - rest of line ignored. 的錯誤。
<span "="">以下是文件開頭部分

1 --create tablespace
2 declare
3 v_tbs_name varchar2(200):='hytpdtsmsshistorydb';
4 begin

  報錯以下:

1 SP2-0734: unknown command beginning "?--create ..." - rest of line ignored.
2 
3 
4 PL/SQL procedure successfully completed.

  網上沒有找到相似問題的解決辦法,且文件編碼確認已經更改成utf-8,該問題困惑了我好久。
  最後查看一下BOM與 no BOM的區別,嘗試更改成no BOM,竟然就沒有再出現錯誤。

  修改完成後,不管使用中文,仍是英文,或者去掉註釋,都能正常執行。


 

 

血淚建議:UTF-8最好不要帶BOM

  UTF-8」和「帶 BOM 的 UTF-8」的區別就是有沒有 BOM。即文件開頭有沒有 U+FEFF。

  一、Linux中查看BOM的方法:使用less命令,其它命令可能看不到效果:

  發現詞語以前多了一個<U+FEFF>。

  二、UTF-8去除BOM的方法

  Linux下:

  (1)

    1)vim打開文件

    2)執行:set nobomb

    3)保存:wq

  (2)

    dos2unix filename

    將windows格式文件轉爲Unix、Linux格式文件。該命令不只可將windows文件的換行符\r\n轉爲Unix、Linux文件的換行符\n,還能夠將UTF-8 Unicode (with BOM)轉換爲UTF-8 Unicode.

  PS:

  遇到一個比較坑爹的狀況,1個UTF-8 Unicode (with BOM)文件中包含兩個<U+FEFF>,這是不管使用方法(1)仍是方法(2),都要執行兩次才能將<U+FEFF>徹底去除!!!

  (2)Windows下,使用NotePad++打開這個文件,而後選擇「編碼」,再選擇「以UTF-8無BOM格式編碼」,最後從新保存文件便可!

相關文章
相關標籤/搜索