目錄
問題的由來
編碼導致的問題
解決辦法
VSCode進行轉換
記事本進行轉換
直接指定輸出的文本編碼
總結
問題的由來
在我的嵌入式系統的課程中有一個裸機開發的實驗,其中需要把圖片等文件轉換為C語言數組保存在程序中。課程中,我推薦了CodePlea的hexembed工具來進行轉換,它將轉換結果輸出到標準輸出設備,使用重定向可以保存為文件。這個方法用了幾年也沒啥問題,不過今年由于使用Windows 11的同學增多,一些同學反應生成的文件在我們裸機開發的環境無法編譯,會報告錯誤。今天來分析一下原因,并給出幾個解決的辦法。
編碼導致的問題
我們使用如下的命令進行重定向保存文本。
.\hexembed.exe .\hexembed.c > hex.h
這個方法在先前的Windows版本中都沒有問題。不過在Windows 11中默認使用PowerShell作為終端,而其默認的文本輸出編碼格式為UTF-16LE。
如果用VS Code或者記事本打開文件,都可以在右下角看到文件的編碼格式。
UTF - 16 是一種 Unicode 編碼方式,它使用 16 位(2 個字節)或 32 位(4 個字節)來表示一個字符。UTF - 16 LE 是 UTF - 16 的小端字節序(Little - Endian)版本,即低位字節存儲在低地址,高位字節存儲在高地址。對于英文文本,UTF - 8 每個字符占用 1 個字節,而 UTF - 16 LE 每個字符至少占用 2 個字節,所以 UTF - 8 更節省空間。對于中文等非 ASCII 字符,UTF - 8 通常使用 3 個字節,UTF - 16 LE 使用 2 個字節,在這種情況下 UTF - 16 LE 更節省空間。我們可以用VS Code的Hex插件打開所轉換得到的文件,就可以清楚地看到它的編碼特點了。
一般的文本編輯器都可以正確處理UTF -16 LE的文本,所以我們感覺不到這種編碼差別,但是裸機開發使用的GCC編譯器不支持這種格式的文本,就會出現編譯錯誤。
解決辦法
下面就介紹幾種解決這個問題的方法。
VSCode進行轉換
在VS Code中可以點擊右下角的UTF-16 LE,然后在彈出的選項中選擇“Save with Encoding”,選擇Western作為保存的編碼格式,然后按CTRL+S保存文件即可。
記事本進行轉換
可以使用記事本打開文件,然后在“另存為”的對話框中指定編碼方式為ANSI。
直接指定輸出的文本編碼
也可以在PowerShell進行重定向時指定編碼格式,不過此時不能使用“>”符號了,需要改用“|”符號,如:
.\hexembed.exe .\hexembed.c | Out-File hex.h -encoding ASCII
這樣生成的文件直接就是ANSI格式的了。?
總結
由于大多數編譯器都是基于ANSI的,所以在文件的編碼格式對于編程就需要格外小心。