ESP32/8266、Arduino開發環境需要用繁體中文字顯示的解法

研究出方法後,給自己一個紀錄。

首先,先去u8g2的開發者抓工具檔案下來:
https://github.com/olikraus/u8g2
解壓縮後,這個資料夾有兩個是待會要用的轉檔程式連結:
.\u8g2-master\u8g2-master\tools\font\otf2bdf\
.\u8g2-master\u8g2-master\tools\font\bdfconv\
以及開發者已經做好的常用中文字型檔:
.\u8g2-master\tools\font\build\chinese1.map
那因為自己在開發使用的繁體字,這裡可能回沒有相關的UNICODE碼,所以我們試著自己增加程式想要用的中文字。

可以利用這個網站工具,幫忙把需要的繁體字轉成UNICODE碼。
https://www.ifreesite.com/unicode-ascii-ansi.htm
例如:
一,二,三,四,五,六,七,八,九,十,零,
甲,乙,丙,丁,戊,己,庚,辛,壬,癸,
子,丑,寅,卯,辰,巳,午,未,申,酉,戌,亥,
把它貼上,取的下面類似\uXXX開頭的字串。

我們用記事本++或其他自己習慣的編輯軟體,把\u取代成$。
然後把這新增的中文字,複製貼上到剛剛說的chinese1.map裡面的最後面那一行新增上去。

接著,例如我有個字型檔,檔名叫做SourceHanSansTC-Regular.otf。(https://github.com/adobe-fonts/source-han-sans)
cd .\u8g2-master\u8g2-master\tools\font\otf2bdf
.\otf2bdf.exe -p 18 -r 72 -o SourceHanSansTCRegular_18.bdf SourceHanSansTC-Regular.otf
這樣生出一個18pt的BDF字型檔出來。
(NOTE1: 可能要在自己的C:\新增一個tmp資料夾,避免產檔產生錯誤訊息。)
(NOTE2: 字型檔名如果有-的,要改成_或刪除該字串。)

在來,我們利用這個BDF字型檔,創建有包含chinese1.map定義到的字型來輸出。
cd .\u8g2-master\u8g2-master\tools\font\bdfconv
.\bdfconv.exe -v ../otf2bdf/SourceHanSansTCRegular_18.bdf -b 0 -f 1 -M ../build/chinese1.map -n u8g2_font_jir_SourceHanSansTCRegular_18 -o u8g2_font_jir_SourceHanSansTCRegular_18.c

我們把剛剛做好的僅有chinese1.map的中文字體檔案,u8g2_font_jir_msjh_18.c複製到自己開發的程式資料夾裡面。
那因為我用的是另外一個作者,基於u8g2的開發環境的延伸中文字體函式庫:https://github.com/Bodmer/U8g2_for_TFT_eSPI
所以我需要把檔案抬頭改成能支援它的語法。
改檔名,把u8g2_font_jir_SourceHanSansTCRegular_18.c -改成-> u8g2_font_jir_SourceHanSansTCRegular_18.h,用記事本打開編輯新增第一行。
然後這個套件的檔案:.\Arduino\libraries\U8g2_for_TFT_eSPI-master\src\u8g2_fonts.h打開後,把整個內容複製。
整個貼到u8g2_font_jir_SourceHanSansTCRegular_18.h第一行,存檔。

那麼,Arduino程式開發中,要用的字型檔,就能使用這個自己新增的檔案,這樣呼叫來使用顯示中文字。
#include
#include "u8g2_font_jir_SourceHanSansTCRegular_18.h"
TFT_eSPI tft = TFT_eSPI();
U8g2_for_TFT_eSPI u8g2;
void setup() {
Serial.begin(115200);
tft.init();
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
u8g2.begin(tft);
//// u8g2和自訂字型
// 清空畫面
tft.fillRect(0, 0, 320, 170, TFT_BLACK);
u8g2.setFont(u8g2_font_jir_SourceHanSansTCRegular_18);
u8g2.setForegroundColor(TFT_WHITE);
u8g2.setCursor(0, 28);
u8g2.print("甲,乙,丙,丁,戊,己,庚,辛,壬,癸");
}
void loop() {
}

支援以後,就能開發出類似我這個撰寫的小程式顯示需求了。

PS. 第一行:前面還有中文字。如果沒顯示到,就是重複剛剛的步驟,把chinese1.map加入自己要的字UNICODE補充,重編譯,掛載就會能正常顯示了。

其他參考文章:
https://blog.jmaker.com.tw/chinese_oled/

2 thoughts on “ESP32/8266、Arduino開發環境需要用繁體中文字顯示的解法

發佈回覆給「Jir」的留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

請輸入下列驗證碼計算後阿拉伯數字 (Translate it, if not Taiwanese to post reply) *