最近寫了1個小工具,主要實現自動搜索指定路徑下所有文本文件內容,并替換指定字符串,記錄下幾個容易出錯誤的地方。
1,fread讀出來的buffer寄存到string里,如果要搜索指定的字符串,比如“中華人民共和國”,首先要肯定文件的編碼格式是甚么?根據文件的編碼格式,對目標串進行編碼轉換后,才能用string.find去進行查找。
而如何判斷文件的編碼格式呢,windows下文本文件1般有兩種字符集,unicode和gbk,根據文件的前3個字節來決定該文件的編碼格式,這3個字節是 “EF BB BF”,如果前3個字節為這3個值,就默許為utf8編碼的,否則默許為gbk。
題外話:固然上面的判斷比較粗略,由于windows下也能夠使用utf16來編碼存儲文件,打開記事本,另存的時候,使用unicode來編碼,或unicode big endian來編碼。windows的記事本會在文件前面用BOM來存儲文件的編碼格式
UTF8編碼的BOM為 EF BB BF
utf16編碼的BOM 為FF FE
utf16 big endian為 FE FF ,
通常uft16也被叫做UCS編碼,通常在windows上我們講unicode編碼,就是指utf16編碼。也有1些術語稱之為寬字符,由于他使用兩個字節來存儲文字,即使是ascii碼,也使用兩個字節來存儲。
那末有人會問,難道單純根據前3個字節來判斷文件編碼格式不會有問題,固然會有問題了,比如你用notepad新建1個文本文件,寫入“聯通”兩個字,然后保存,再次打開,你會發現文件成亂碼了。
為啥呢,由于windows記事本把它當作了utf8編碼來辨認了,到了這里有人會問,不是說utf8都有BOM頭來標識這個是utf8編碼的文件么?沒錯,utf8并沒有強迫使用BOM頭,有BOM頭的utf8文件,也能夠轉換為utf8無bom編碼的格式,可使用notpad++測試下,因此不能notepad不能單純的依托BOM頭來判斷是不是是utf8編碼的,而要對文件中的數據進行簡單的編碼分析來肯定,正是這個緣由,才致使辨認出錯。
首先來看下utf8來的編碼結構,utf8是采取1⑶個字節對字符進行編碼,編碼字節數和unicode字符集有嚴格的對應關系。看下面的對應關系表
Unicode 編碼集 utf8編碼結構
U0001 ― U007E 0XXXXXXX
U0080 ― U07FF和U0000 110XXXXX 10XXXXXX
U0800 ― UFFFF 1110XXXX 10XXXXXX
聯通的gbk字符集是“C1 AA CD A8”
C1 AA 對應的2進制: 1100 0001, 1010 1010
CD AB 對應的2進制: 1100 1101, 1010 1000
請注意紅色部份,它和UTF8的編碼結構完全1致,因此才誤將其認為是utf8無BOM編碼的文件。可使用notepad++打開來查看這個文件的編碼格式
2,在windows下,換行使用的
來換行,也就是 0D 0A,所以使用2進制來查看文件的時候,會看到換行的地方有很多0D 0A,但是如果fopen的時候僅僅使用 “r”標記來讀文件,會讀不出來0D,必須使用“rb”標記來讀,一樣在寫文件的時候,也要用“wb”來寫,才能吧0D寫進去。
原文查看:http://www.seanyxie.com/windows%E4%B8%8B%E6%96%87%E4%BB%B6%E7%BC%96%E7%A0%81%E5%92%8C%E8%AF%BB%E5%86%99%E6%B3%A8%E6%84%8F/
上一篇 一些自定義的Lua常用的工具函數