關於u8BOM,LF,CRLF的認知。

2021-08-15 23:43:57 字數 1994 閱讀 7120

首先說下遇到的問題。

工作需要,有乙個json檔案需要被簽名後使用。

當時為了開發方便用記事本另存為u8然後簽名,校驗通過,用git push 到repository。

這時候問題來了,發現本地build出來的apk對json檔案簽名的校驗是沒問題的,但是jenkins build出來的就是無法識別json檔案的簽名。

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來標記文字檔案的編碼方式的。

utf-8編碼的檔案中,bom佔三個位元組。如果用記事本把乙個文字檔案另存為utf-8編碼方式的話,用ue開啟這個檔案,切換到十六進製制編輯狀態就可以看到開頭的ef bb bf了。

這是個標識utf-8編碼檔案的好辦法,軟體通過bom來識別這個檔案是否是utf-8編碼,很多軟體還要求讀入的檔案必須帶bom。

可是,還是有很多軟體不能識別bom。

也就是說,我當時用記事本另存為的u8 是帶bom的u8。這樣以來提交上去的檔案是帶了bom,在做簽名校驗的時候當然就會出問題了。

於是在linux下cp了乙份,去掉bom然後提交jenkins的就可以通過簽名校驗了。

什麼?你以為故事到這裡就結束了?耐心往下看~

檔案push上去之後,本地同步了**,於是本地簽名校驗不過了。wtf。

又折騰了半天,本地重新簽名扔進去發現git可以被識別,然後add.commit.push. wtf!居然沒識別有東西提交?!

切新分支,再來一次,commit的時候發現有lf和crlf的提醒。所以你們懂了,問題就出現在這裡。

首先來看下lf和crlf。

在各作業系統下,文字檔案所使用的換行符是不一樣的。unix/linux 使用的是 0x0a(lf),早期的 mac os 使用的是0x0d(cr),後來的 os x 在更換核心後

與 unix 保持一致了。但 dos/windows 一直使用 0x0d0a(crlf)作為換行符。git提供了乙個「換行符自動轉換」功能。這個功能預設處於「自動模式」,當你

在簽出檔案時,它試圖將 unix 換行符(lf)替換為 windows 的換行符(crlf);當你在提交檔案時,它又試圖將 crlf 替換為 lf。git 的「換行符自動轉換」功能聽起來似乎很智慧型、很貼心,因為它試圖一方面保持倉庫內檔案的一致性(unix 風格),一方面又保證本地

檔案的相容性(windows 風格)。但遺憾的是,這個功能是有 bug 的,而且在短期內都不太可能會修正。

這樣以來。linux提交上去的/n的檔案,在我pull下來之後會變成/r/n。簽名校驗當然過不去了。

解決方案:暫無完美解決方案。我可以通過

git config --global core.autocrlf false
或者通過修改gitconfig來關掉自動轉換,達到我當前的目的,可是一旦有人同時在linux環境下進行同檔案的修改,就包含兩種了。就會導致兩邊都不能用的問題。wtf。 

所以暫時的方案是本地留存了json檔案做build,不做提交。

巨坑!有大佬知道完美解決方案的話可以交流交流。

關於STM32庫函式中,u8 u16 等的定義

檔案內定義 typedef uint32 t u32 typedef uint16 t u16 typedef uint8 t u8 無符號 typedef int32 t s32 typedef int16 t s16 typedef int8 t s8 有符號 exact width unsig...

jointJS 一) 關於jointJS的初認識

最近由於專案需要,開始接觸jointjs,妥妥不停刷文件模式,先寫一下對於jointjs的粗淺認識吧。我們可以使用jointjs已提供的圖元素繪圖,也可根據需求自定義一些圖元素。除此之外,jointjs建立的圖表就是svg圖形,想改變圖形樣式,就去googlesvg相關語法就好啦。另外,它極易上手且...

由ArrayList引發的關於淺拷貝的認知誤區

首先,無論深拷貝還是淺拷貝,拷貝的結果,都是乙個新的物件!但是,淺拷貝對於二級目錄中引用型別,都是直接拷貝引用,而非開闢新記憶體。arraylist是淺拷貝的。這裡的淺拷貝,指的是 arraylist拷貝的結果,是乙個新的arraylist,但是新arraylist中的成員,都是老arraylist...