文字檔案與二進位制檔案、Unicode字元編碼 - 程式人生
文章推薦指數: 80 %
BOM是一個有點小聰明的想法:在UCS編碼中有一個叫做"ZERO WIDTH NO-BREAK SPACE"的字元,它的編碼是FEFF。
而FFFE在UCS中是不存在的字元,所以不應該出現在 ...
程式人生>>文字檔案與二進位制檔案、Unicode字元編碼
文字檔案與二進位制檔案、Unicode字元編碼
阿新••發佈:2019-02-12
從網上找到一篇文章,寫的挺基礎,通俗易懂的,和大家分享:
現在搞懂了文字檔案與二進位制檔案之間的關係啦.
我們可以利用二進位制編輯器檢視文字檔案.
上圖紅框中的左邊是十六進位制顯示的,右邊是文字(ascii
在程式中有這麼一句:
開始我不明白為什麼要寫兩個位元組的"fffe",後才上網查了一下資料才發現,這與編碼方式有關.
UTF的位元組序和BOM
UTF-8以位元組為編碼單元,沒有位元組序的問題。
UTF-16以兩個位元組為編碼單元,在解釋一個UTF-16文字前,首先要弄清楚每個編碼單元的位元組序。
例如收到一個"奎"的Unicode編碼是594E,"乙"的Unicode編碼是4E59。
如果我們收到UTF-16位元組流"594E",那麼這是"奎"還是"乙"?
Unicode規範中推薦的標記位元組順序的方法是BOM。
BOM不是"BillOfMaterial"的BOM表,而是ByteOrderMark。
BOM是一個有點小聰明的想法:在UCS編碼中有一個叫做"ZEROWIDTHNO-BREAKSPACE"的字元,它的編碼是FEFF。
而FFFE在UCS中是不存在的字元,所以不應該出現在實際傳輸中。
UCS規範建議我們在傳輸位元組流前,先傳輸字元"ZEROWIDTH
NO-BREAKSPACE"。
這樣如果接收者收到FEFF,就表明這個位元組流是Big-Endian的;如果收到FFFE,就表明這個位元組流是Little-Endian的。
因此字元"ZEROWIDTHNO-BREAKSPACE"又被稱作BOM。
UTF-8不需要BOM來表明位元組順序,但可以用BOM來表明編碼方式。
字元"ZEROWIDTHNO-BREAKSPACE"的UTF-8編碼是EFBBBF。
所以如果接收者收到以EFBBBF開頭的位元組流,就知道這是UTF-8編碼了。
Windows就是使用BOM來標記文字檔案的編碼方式的。
———————————————————-
好了﹐這些問題解決後﹐我們就來做單純的文字檔案的編碼識別﹐讀取與寫入測試吧。
以windows的notepad為例(其它的文字檔案讀取軟體的原理應該也差不多﹐只是會多一些特殊的判斷演算法而已)。
notepad預設有四種編碼來儲存和讀取文字檔案。
分別是﹕
ANSI,Unicode,Unicode-big-endian和UTF-8。
首先來講ANSI吧﹐這個是windows作業系統在區域與語言塊設定的編碼(也就是系統預設的編碼)﹐因此像繁體作業系統就是big5,而簡體作業系統則是GBK。
而Unicode和UTF-8這兩種格式相信大家已經有所瞭解(當然前者是unicode-16)
而Unicode-big-endian是什麼意思呢﹐它與Unicode幾乎一樣﹐只是它把高位放在前面(而後者則剛好相反)
上面的摘錄已經有所說明﹐這裡再解釋一下﹕
如同樣是字元"A"﹐在以下幾種格式中的儲存形式分別是﹕
UTF-16big-endian:0041
UTF-16little-endian:4100
UTF-32big-endian:00000041
UTF-32little-endian:41000000
好了﹐大家想一想﹐文字檔案在硬碟中是以位元組形式儲存的﹐如果不知道文字檔案的編碼﹐那是無論如何也不能正確讀出文字檔案顯示給使用者看的(亂碼了只有人才知道﹐程式則認為一切正常)
根據BOM的規則﹐因此在一段位元組流開始時﹐如果接收到以下位元組﹐則分別表明了該文字檔案的編碼。
UTF-8:EFBBBF
UTF-16:FFFE
UTF-16big-endian:FEFF
UTF-32little-endian:FFFE0000
UTF-32big-endian:0000FEFF
而如果不是以這個開頭﹐那程式則會以ANSI,也就是系統預設編碼讀取
單例模式之懶漢模式(延遲載入)
«上一篇
配置Eclipse的hadoop-eclipse-plugin.jar(自學隨筆)下一篇»
相關推薦
文字檔案與二進位制檔案區別
1)文字檔案:這類檔案以文字的ASCII碼形式儲存在計算機中。
它是以"行"為基本結構的一種資訊組織和儲存方式。
2)二進位制...
fopen,文字檔案與二進位制檔案
暮鼓集 行走集
在學習C語言檔案操作後,我們都會知道開啟檔案的函式是fopen,也知道它的第...
淺談C語言中文字檔案與二進位制檔案
C語言中,按檔案中的資料組織形式來分,資料檔案可分為ASCII碼檔案(即文字檔案)和二進位制檔案。
文字檔案在磁碟中存放時每...
文字檔案與二進位制檔案、Unicode字元編碼
從網上找到一篇文章,寫的挺基礎,通俗易懂的,和大家分享:
現在搞懂了文字檔案與二進位制檔案之間的關係啦.
...
文字檔案與二進位制的區別
簡單來說,文字檔案是基於字元編碼的檔案,常見的編碼有ASCII編碼,UNICODE編碼等等。
二進位制檔案是基於值編碼的檔案,你可以根據具體應用,指定某個值是什麼...
文字方式與二進位制方式讀寫檔案的windows區別總結
一、寫
二進位制方式寫,當遇到整型和浮點數時是以小端模式的整個十六進位制值寫入到檔案中(和記憶體中一樣),當遇到a...
pythonfile模組中的文字檔案和二進位制檔案以及字串和byte的理解
大前提:文字檔案和二進位制檔案都是以二進位制的方式存放到硬碟中的
看圖先~
1.Pythonfile讀寫加不加b
...
文字檔案和二進位制檔案的區別和聯絡
今天閒來無事,也學一下別人寫一下部落格:
在一些專案中常遇到一些檔案的操作,今天就總結一下。
或許自己寫一寫,把思路縷一...
文字檔案和二進位制檔案判定
現在我有一個小說檔案:完美世界.txt。
它是文字檔案,我把它字尾改了,變成:完美世界.avi。
那麼其實它還是一個...
java中如何判斷一個檔案是二進位制檔案還是文字檔案?
現在的做法是把檔案讀進來,逐個解析每一個byte,如果有一個byte<0那麼斷定這個檔案是二進位制的,這在純英文的環境下...
搜尋
基礎教學
Mysql入門
Sql入門
Android入門
Docker入門
Go語言入門
Ruby程式入門
Python入門
Python進階
Django入門
Python爬蟲入門
最近訪問
文字檔案與二進位制檔案、Unicode字元編碼
在ASP.NET中動態建立柱狀圖和餅圖
開源電子書專案FBReader初探(六)
【Socket程式設計】Python用udp實現簡易ping
Xcode編譯報錯duplicate+symbol+_base64Decode+in:
openGL學習筆記1(入門----如何繪製++直線、多邊形、圓、利用圖片繪製圖形等)
Android+EditText+改變邊框顏色
ROM、RAM、IROM、IRAM、DRAM、SRAM、Flash介紹
C++如何輸入多行字串(含空格)
C++之佇列和優先佇列
延伸文章資訊
- 1位元組順序記號 - 维基百科
位元組順序記號(英語:byte-order mark,BOM)是位於碼點 U+FEFF 的統一碼字符的名称。 ... 每個Unicode編碼(包括Unicode標準以外的編碼,如UTF-7,見下...
- 2Unicode 與UTF - OpenHome.cc
Unicode 字元映射至數字的概念編碼(Conceptual encoding),一個字元的Unicode ... 可以看到,用來表示為Unicode 檔案的兩個位元組為fe、ff,與先前的f...
- 3<Not a Character>: U+FFFE
Symbol: , Name of the character: , Unicode number for the sign: U+FFFE, the icon is included in ...
- 4有關編碼(UTF-8 and Unicode)的相關知識@ 諺語錄 - 隨意窩
在UCS(UCS可以看作是"Unicode Character Set"的縮寫。) 編碼中有一個叫做"ZERO WIDTH NO-BREAK SPACE"的字符, 它的編碼是FEFF。而FFFE...
- 5u+FFFE copy and paste - Unicode® symbol
U+FFFE is not a valid Unicode code point / character. It belongs to the "Specials" block which go...