JAVA輸出帶BOM的UTF-8編碼的檔案 - 程式人生

文章推薦指數: 80 %
投票人數:10人

微軟在UTF-8 中使用BOM 是因為這樣可以把UTF-8 和ASCII 等編碼明確區分開。

否則用Excel開啟CSV檔案有可能是亂碼的示例程式碼如下: response. 程式人生>>JAVA輸出帶BOM的UTF-8編碼的檔案 JAVA輸出帶BOM的UTF-8編碼的檔案 阿新••發佈:2019-01-26 當從http的response輸出CSV檔案的時候,設定為utf8的時候預設是不帶bom的,但是windows的Excel是使用bom來確認utf8編碼的,所有需要把bom寫到檔案的開頭。

微軟在UTF-8中使用BOM是因為這樣可以把UTF-8和ASCII等編碼明確區分開。

否則用Excel開啟CSV檔案有可能是亂碼的示例程式碼如下:response.setContentType("text/csv");response.setHeader("Content-Disposition","attachment;filename="+fileName);response.setCharacterEncoding("UTF-8");byte[]uft8bom={(byte)0xef,(byte)0xbb,(byte)0xbf};OutputStreamout=response.getOutputStream();out.write(uft8bom);OutputStreamWriterwriter=newOutputStreamWriter(out,"UTF-8");//writeothercontent...什麼是BOM:BOM(byte-ordermark),即位元組順序標記,它是插入到以UTF-8、UTF16或UTF-32編碼Unicode檔案開頭的特殊標記,用來識別Unicode檔案的編碼型別。

對於UTF-8來說,BOM並不是必須的,因為BOM是用來標記多位元組編碼檔案的編碼型別和位元組順序(big-endian或little-endian)。

而UTF8中,每個字元的編碼有多少位是通過第一個位元組來表述的,而且沒有big-endian和little-endian的區分,見後述。

BOMs檔案頭:  0000FEFF   =UTF-32,big-endian  FFFE0000   =UTF-32,little-endian  EFBBBF      =UTF-8,  FEFF         =UTF-16,big-endian  FFFE         =UTF-16,little-endian還有一個要注意的是:UTF-8的網頁程式碼不應使用BOM,否則常常會出錯:在網頁上使用BOM是個錯誤。

BOM設計出來不是用來支援HTML和XML的。

要識別文字編碼,HTML有charset屬性,XML有encoding屬性,沒必要拉BOM撐場面。

雖然理論上BOM可以用來識別UTF-16編碼的HTML頁面,但實際工程上很少有人這麼幹。

畢竟UTF-16這種編碼連ASCII都雙位元組,實在不適用於做網頁。

Windows使用BOM的歷史原因:通常BOM是用來標示Unicode純文字位元組流的,用來提供一種方便的方法讓文字處理程式識別讀入的.txt檔案是哪個Unicode編碼(UTF-8,UTF-16BE,UTF-16LE)。

Windows相對對BOM處理比較好,是因為Windows把Unicode識別程式碼整合進了API裡,主要是CreateFile()。

開啟文字檔案時它會自動識別並剔除BOM。

Windows用這個有歷史原因,因為它最初脫胎於多內碼表的環境。

而引入Unicode時Windows的設計者又希望能在使用者不注意的情況下同時相容Unicode和非Unicode(Multiplebyte)文字檔案,就只能藉助這種小trick了。

帶BOM的文字檔案在Linux/unix環境又經常會遇到問題:知乎介紹的很詳細:http://www.zhihu.com/question/20167122文字檔案解析:    文字檔案對應於人類可以閱讀的文字,如何從2進位制轉換為文字檔案呢?起初由於計算機在美國發明,自然大家考慮的是英語如何表示,英語字母總共26個,加上特殊字元,128個字元,7位既一個byte即可表示出來。

這個就是大家所熟知的ascill編碼。

對應關係很簡單,一個字元對應一一個byte。

    但很快發現,其他非英語國家的文字遠遠超過ascill碼,這時候大家當然想統一一下,不同國家出了自己不同的編碼方式,中國的gb2312就是自己做出來的編碼方式,這樣下去每個國家都有自己的編碼方式,來回轉換太麻煩了。

這時候出現了新的編碼方式,unicode編碼方式,想將編碼統一,所以規定了每個字元對應的unicode碼。

    1、很多檔案都是ascii編碼,如果用unicode太浪費。

    2、沒有標誌位說明該幾個位元組來解析為一個符號。

    這時候拯救世界的utf出現了,utf是unicode的一種實現,只不過更聰明瞭。

utf16是佔用兩位元組,或者四位元組,utf32是佔用四位元組。

utf8是很聰明的一種表示方式。

    1、對於單位元組符號,位元組第一位為0,後面7位表示位元組編碼。

    2、對於n位元組符號,第一位元組的前n位都設為1,第n+1位為0,其餘位用於編碼。

對於不同的編碼,在文字的最前方有不同的標誌,unicode通常有兩位來表示分別是fffe,或者feff,fffe表示litte-endian編碼feff表示big-endian編碼。

utf8是efbbbf來開頭的。

可以看出來utf-8是自解釋的,所以不用帶這個標誌檔案,大多數程式是可以識別的。

但有些程式不能識別這個標誌,比如php就會直接把這個標誌當文字解析,不會忽略。

純程式碼TableView例項 «上一篇 hive1.2.1原始碼匯入eclipse閱讀以及除錯下一篇» 相關推薦 在Java中讀寫UTF-8編碼檔案  在C#中,採用System.IO.StreamReader和System.IO.StreamWriter直接讀寫UTF-8編... java輸出日誌到指定檔案中 1.在我們專案開發中經常要將專案的異常日誌輸出到制定看路徑的檔案中,下面用java實現日誌輸出功能。

直接上程式碼如下所示:/**&nbsp... 關於Python文件讀取UTF-8編碼檔案問題 引用codecs模組,來判斷前三個位元組是否為BOM_UTF8。

如果是,則剔除\xef\xbb\xbf位元組 importcodecs de... J2ME讀取UTF-8編碼檔案方法   在進入正題前先說點別的,Polish更新到2.0bate2了,增加了N多東西。

看api學習已經變的非常繁重而且不易實現... ISO8859(GBK)編碼檔案轉碼到UTF-8編碼檔案 問題產生:         現需要把一個在windows的Myeclipse下開發的小程式,轉到Linux系統下去安裝執行... JAVA輸出帶BOM的UTF-8編碼的檔案 當從http的response輸出CSV檔案的時候,設定為utf8的時候預設是不帶bom的,但是windows的Excel是... day02迴圈、格式化輸出、運算子、編碼 01昨日內容回顧python2xpython3x區別:python2x:原始碼重複,不規範。

python3x:原始碼規範,優美,清晰,簡單。

編譯... java程式碼實現LogBack動態輸出日誌【無配置檔案純程式碼】 需求:      需要傳入某一個檔案或者類或者方法的名字,生成對應日誌檔案,且每一個傳入... while迴圈/格式化輸出/運算子/編碼 1.while迴圈   while條件:     迴圈體(break,continue)   else:     迴圈體(break,continu... RobotFramework:日誌輸出中文Unicode編碼 robotframework輸出日誌時,中文顯示為Unicode編碼。

修改方法: 在Python27\Lib\site-packages\robotf... 搜尋 基礎教學 Mysql入門 Sql入門 Android入門 Docker入門 Go語言入門 Ruby程式入門 Python入門 Python進階 Django入門 Python爬蟲入門 最近訪問 JAVA輸出帶BOM的UTF-8編碼的檔案 在LaTeX中使用強大的pgfplots繪圖包 安裝Termux的手機上執行Python Glide下載圖片並儲存到指定路徑 python+web框架的介紹 mongodb建立資料庫和配置使用者 'react-scripts'+不是內部或外部命令,也不是可執行的程式+或批處理檔案--解決方案 C+++set用法總結(整理) 高職院校對口單招資訊一類《專業技能》模擬試題(程式設計題) SpringMVC詳解(一)------入門例項



請為這篇文章評分?