FC2ブログ
2018-01-22 17:35 | カテゴリ:コンピュータ

美咲フォントの使い方で悩んでいます。

「あ」は表示できたのに「日」がエラーとなってしまいました。

原因を探っていきました。

(TH0200)
TH0200.jpg



このフォントのダンプデータを見ていて、ハタと気づきました。


続きは、、、、





ひらがなは表示できるのに漢字一文字の表示がエラーとなります。
参考にさせていただいたTOMOSOFTさんのWEbのプログラムをもう一度確認します。
(C言語です)


bmpr=fopen(font_path,"rb");

fread(bhd,1,62,bmpr); // ヘッダファイルの読み込み

fread(FontData,1,96*94,bmpr); // 画像データの読み込み

8x8ドットの美咲フォントのデータ(BMPデータで保存)を96x94バイトの配列に読み込んでいます。(C言語です)
BMPデータは、縦横で94x94文字の画像です。(横は94ですが2バイトのダミーがあります)
これを参考にして、私がPythonで組んだプログラムの一部です。

(TH0201)
TH0201.jpg



94行だから94バイト!?

あれ~??
横は8ドット=1バイトなので94(96)バイトで良いですが、縦はドットが8行ありますから、94バイトではなく、94x8=752行(バイト分)なくては全データを読み込めません。
そこで配列の定義を変更して、752にしました。

(TH0202)
TH0202.jpg


なーんだ、このWEBのままでは、一部のフォントしか読み込んでいなかったようです。
そこで、94->752にして、試したら、ちゃんと「日」のデータもOKでした。

さて、美咲フォントをアクセスするために「句点コード」を与えれば、何とか対応する日本語のフォントデータが得られることは確認できました。

次は、この「句点コード」をどの様に得るのかと言う事が問題です。
RasPiを初めて調べてみてわかったのですが、RasPi自体は、「JA-JP.UTF-8コード」で記述され、Pythonも同様です。
このUTF-8コードから、句点コード(JISコード)に変換しなければなりません。
RasPiはその設定メニューで、EUC-JPコードなどに変更できます。

(TH0203)
TH0203.jpg

(TH0203a)
TH0203a.jpg


早速、EUC-JPコードに変更して、再起動しました。

ところが、なぜかRasPiのファイルマネージャを起動してみると、日本語が文字化けしていました。
RasPi本体の文字コードは、UTF-8のまま(デフォルト)で使用したほうがよさそうです。
そうすると、この文字コード変換は、Pythonのプログラム中で行わねばなりません。


Pythonには、そういう文字コードを変換する関数(メソッド)がちゃんとありました。(すごい!)

(TH0204)
TH0204.jpg

私の考えた方法が正しいかわかりませんが、これで動作しているので良しとします。
他にもっとスマートな方法があると思いますが、、、

(緑の線)
変数Jcode(mojiに置き換え)で与えられた、UTF-8のコード(2バイト)を
.encode('euc-jp')
で、euc-jpコード体系に変換し、かつ、
int.from_bytes()
で、バイト形式データから、int形式データに変換し、後の処理をやりやすくします。
'big'
は、バイト形式が、LSBとMSBのどちらが大きいかを示します。

また、moji_codeから0xa0a0を引いて、JISコード(句点コード)に変換しています。(赤の線)

句点コードに変換できれば、16進の値と考えて、上位2桁と下位2桁に分け、上位を句コード、下位を点コードと分けて美咲フォントをアクセスします。

(TH0205)
TH0205.jpg

先ほどの句(ku)と点(ten)でMisaki_dataをアクセスし、8x8フォントを8バイト分得ます。(赤枠)
実は、このデータは私のLEDマトリクスの環境では、ドット位置が左右反転(MSBとLSB)していましたので、プログラム上で反転させました。(緑枠)

そして、最後に余分なビットデータを消してChr_Buffに代入します。(青枠)

これを使用して、キーボードから日本語を一文字入力して、そのコードを変換して美咲フォントをアクセスし、表示するところまで作成しました。

(TH0206)
TH0206.jpg

キーボードから「森」を入力して、そのフォントが表示されました。
まだ、LEDに表示させるところまで、あと一歩ですが、あとは文字列として与えて、それを連続表示できるようにすれば、「天気予報の概況」などもスクロール表示できると踏んでいます。(楽観的!)(笑)

早々にキーから任意の日本語文字を入力し、それを表示させるように組んでみました。
新年早々なので、「謹賀新年」と結構複雑な漢字を選定し表示させました。

(TH0207)
TH0207.jpg

で、実際のLEDへの表示がこちらです。

(TH0207a)
TH0207a.jpg

離れて薄目を開けてみれば、「謹賀新年」と読めなくはありません。
元々、「謹賀新年」と書いてしまっていますので、そういう先入観で観ているからでしょうか。(笑)
「滋賀」とも読めそうです。

文字の表示部分の関数がこちらです。

(TH0208)
TH0208.jpg

これで、天気予報のWEBデータを取り込んで、このプログラムに送り込めば、概況や天気、気温などの情報を表示できそうです。

作業にかかろうとして、ふと天気予報データの出力を見ていると、ちょっと困ったことを発見しました。
データに一部半角文字が混在しているのです。
数字や、概況の説明の区切りに、半角スペースも入っています。

(TH0209)
TH0209.jpg

2バイト文字と半角の文字(1バイトアスキー)が混在するとエラーが出ます。
そこで、ASCII文字コードの場合は、それを全角のJISコードに変換する処理を追加しました。

(TH0210)
TH0210.jpg

処理内容は、文字コードが0xFF以下なら、0xFEE0を加えるという処理です。
計算上はこれでJISになります。


と言うわけで、新年早々の
天気予報の音声アナウンス+マトリクスLED漢字表示」が出来ました!!

動画見てください!
ビデオのシャッター速度の関係で、一部表示が乱れました(笑)
実際にはきれいに表示されています。

「プログラムをご覧になりたい方、コメントでお知らせください。メールでお送りします」



関連記事

管理者のみに表示する