ESP32で 漢字を表示するプログラムを作ってみた(ESP32、SSD1306) | a24a24a24のブログ

a24a24a24のブログ

アメピグ残党。
釣り、温泉、お出かけ、パソコン。最近、電子工作。

※4月に自作したプログラムの話です。

何をやったか忘れそうなので、メモ代わりにまとめました。

 

 

 

 

 

ESP32で、SSD1306という小さなOLED表示器に、日本語=漢字を表示してみました。

 

以前、Arduino Uno?で同様の作例を見たので、

「腕試しにイチから組んでみよう」という、軽い思いつきでした。

 

しかし、フォントや文字コードに関する”知識ゼロ”からのスタートで、なかなか大変でした。

 

 

 

 

ESP32は「漢字」はおろか「英数字」すら、一切の文字データを持っていません。

数千個ある全漢字のドット絵データを、使いやすい形で準備(自作)する。そこから開始です。

 

 

 

 

フリーの「東雲フォント」ページを見つけて、フォントデータをお借りしました。

.BDFというファイル形式です。

1文字が16×16ドットの物を使うことにします。

 

 

 

 

Chortkeh BDF Font Viewerというフリーソフトで、BDFファイルを表示してみました。

扱う文字の多さ=数千種類に、改めてげっそり。

 

 

 

 

半角の英数字は別のBDFファイルに分かれていました。

100文字程度、このフォントデータも併用します。

 

 

 

 

BDFファイルの中身は、こんな感じで文字の羅列です。

まあ、読めなくはない・・・かな。

ちなみに。上のうち23行分で、たった「1文字」のデータ。漢字全体は数千倍あります。

 

 

 

 

BDFファイルの構造を解説しているサイトで、フォーマットを読み理解します。

itouh の部屋 bdf2bmp

 

 

 

さて、ここで重要なことに気づきます。

 

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, "吾輩は猫である。");

 

全角と半角英数字の混在も可能です。

 

 

 

 

・・・以上、漢字の表示プログラムを作るだけで、およそ一週間かかりました。

思ったより大変でした。

 

今回作った漢字データの配列を、ネットに公開しようか考えたのですが

大量のデータを全てチェックした訳ではなく、間違いがあると良くないので諦めました。

 

以上、何かの参考になれば幸いです。