※4月に自作したプログラムの話です。
何をやったか忘れそうなので、メモ代わりにまとめました。
ESP32で、SSD1306という小さなOLED表示器に、日本語=漢字を表示してみました。
以前、Arduino Uno?で同様の作例を見たので、
「腕試しにイチから組んでみよう」という、軽い思いつきでした。
しかし、フォントや文字コードに関する”知識ゼロ”からのスタートで、なかなか大変でした。
ESP32は「漢字」はおろか「英数字」すら、一切の文字データを持っていません。
数千個ある全漢字のドット絵データを、使いやすい形で準備(自作)する。そこから開始です。
フリーの「東雲フォント」ページを見つけて、フォントデータをお借りしました。
.BDFというファイル形式です。
1文字が16×16ドットの物を使うことにします。
Chortkeh BDF Font Viewerというフリーソフトで、BDFファイルを表示してみました。
扱う文字の多さ=数千種類に、改めてげっそり。
半角の英数字は別のBDFファイルに分かれていました。
100文字程度、このフォントデータも併用します。
BDFファイルの中身は、こんな感じで文字の羅列です。
まあ、読めなくはない・・・かな。
ちなみに。上のうち23行分で、たった「1文字」のデータ。漢字全体は数千倍あります。
BDFファイルの構造を解説しているサイトで、フォーマットを読み理解します。
さて、ここで重要なことに気づきます。
PCで文字を表す番号「文字コード」は複数の表現があるのですが、
BDFファイルの文字コード=JISコード形式 1~2バイト
ESP32のプログラムを組むArduino IDE上の文字コード=UTF-8形式 1~4バイト
文字コードのUTF-8→JIS変換処理が必要です。
しかし、国際規格で定められた1対1の対応がバラバラで、
単純計算によるUTF-8→JISコード変換は難しいっぽい(私が調べた限り)
プログラム環境により文字コードを変換する関数もあるらしいが、Arduino IDEは無さそう。
ネット上にJIS、S-JIS、EUC、UTF-8、UTF-16の文字コード表を見つけました。
こちらを元に、C言語 配列形式の変換テーブルを作ります。数千文字分。
jis2utf8tbl[8994]という変換テーブルを作りました。
作り方は、漢字コード表をテキストファイルに貼り付けて、ESP32のSPIFFSにファイル転送。
自前のテキストコンバータを作成、C言語ソース形式で吐き出しました。
文字コードの変換テーブルと、BDFファイルの文字ドットデータを統合して
shnmk16[7100]という構造体配列を作りました。
ようやく漢字表示に必要なデータの完成。
全7100文字、337KBになりました。
SSD1306への漢字表示プログラムを自作(表示周りの説明は省略)、
「shnmk16_fn2.h」というファイルにまとめて、
プログラムにC言語形式のフォントデータをペタっと貼り付けるか#includeするだけで、
簡単に漢字表示ができるようにしました。
一行分の表示はこんな感じで出来ます。
put_strtoschr16(0,0, "吾輩は猫である。");
全角と半角英数字の混在も可能です。
・・・以上、漢字の表示プログラムを作るだけで、およそ一週間かかりました。
思ったより大変でした。
今回作った漢字データの配列を、ネットに公開しようか考えたのですが
大量のデータを全てチェックした訳ではなく、間違いがあると良くないので諦めました。
以上、何かの参考になれば幸いです。