フォト
2024年4月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        
無料ブログはココログ

« 明けましておめでとう! | トップページ | Raspberry Pi Pico MicroPython用美咲フォントライブラリの更新 »

2024年3月 7日 (木)

美咲フォントの調査(メモ その1)

以前作成した Arduino用の漢字フォントライブラリの更新を前提に実装の見直し中です。
ライブラリはLittle Limitさんが開発&公開している「美咲フォント」を利用しています。

ライブラリは美咲フォントの古いバージョン(2012-06-03 正式公開初版)のJISコードベース版を利用しており、
面倒くさいコード変換(JISコード⇒ユニコード)をしていました。そのための不都合が若干生じていました。

最新版の美咲フォントでは、ユニコードを採用しているので、最新版を使った方が当然良いですね。
そこで、ライブラリ見直しのための調査を行うことにしました。この記事はその調査のメモです。
美咲フォント 最新版(X11 BDF 形式(misaki_bdf_2021-05-05.zip)の「美咲ゴシック第2」を利用する予定です。

□ 美咲フォントのサポート文字
 美咲フォントは7,170文字のフォントを実装しています。調べてみると具体的に次の文字ブロックを網羅しています。

Unicode範囲 文字ブロック 文字数 美咲フォント
実装文字数
備考
0000~007F C0制御文字と基本ラテン文字 95 95 非漢字
0080~00FF C1制御文字とラテン1補助 95 15 非漢字
0370~03FF ギリシア文字及びコプト文字 135 48 非漢字
0400~04FF キリル文字 256 66 非漢字
2000~206F 一般句読点 111 20 非漢字
2100~214F 文字様記号 80 4 非漢字(℃№℡Å)
2150~218F 数字に準じるもの 60 10 非漢字(ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ)
2190~21FF 矢印 112 6 非漢字(←↑→↓⇒⇔)
2200~22FF 数学記号 256 37 非漢字
2300~23FF その他の技術用記号 256 1 非漢字(⌒)
2460~24FF 囲み英数字 160 20 非漢字
2500~257F けい線素辺 128 43 非漢字
2580~259F ブロック要素 32 17 非漢字
25A0~25FF 幾何学模様 96 16 非漢字
2600~26FF その他の記号 256 15 非漢字(★☆♀♂♠♡♢♣♤♥♦♧♪♭♯)
3000~303F CJKの記号及び句読点 64 24 非漢字
3040~309F 平仮名 93 87 ひらがな
30A0~30FF 片仮名 96 90 カタカナ
3200~32FF 囲みCJK文字・月 256 9 非漢字(㈱㈲㈹㊤㊥㊦㊧㊨㋿)
3300~33FF CJK互換用文字 256 28 非漢字
4E00~9FFF CJK統合漢字 20,992 6,356 漢字・非漢字
FF00~FFEF 半角・全角形 225 163  
合計 24,446 7,170  

□ 美咲フォントの1バイト文字のサポート文字
 美咲フォントの「C0制御文字と基本ラテン文字」、「C1制御文字とラテン1補助」ブロックの対応状況です。

Unicode-1
 ※ utf-8では、0x80以降は11ビット扱いで2バイトになることに注意

 このブロックでの留意事項
  ・半角 ”¥" は0xA5 を使う。日本語Windows環境では、半角"\" 0x5cが"¥"になるので要注意
  ・「ラテン1補助」 "§", "¨", "°", "±", "´", "¶", "×", "÷" は
   Windows環境の日本語等幅フォントでは全角幅、欧文等幅フォントでは半角幅となる
   Ms
  Consols
   これらの文字は、シフトJISでは2バイト文字なんですが、ユニコード(※utf-8はで2バイト)では1バイトなんですよね..
   シフトJIS環境を慣れ親しんだ私には、若干違和感がありますね~
   美咲フォント的には、これらの文字は全角幅扱いです

   例:”±"のフォント
   20240307-112027

□ 半角・全角文字変換に関する留意点
 組み込み環境で液晶やLEDドットマトリックスなどの表示器にフォントを表示する場合、全角・半角を意識する必要があります。
 半角・全角判定、双方向変換を行うために半角・全角の対応を調べて表にしました。

半角文字 全角文字 備考
コード 16進数 文字 コード 16進数 文字
32 0x20   12288 0x3000    
33 0x21 ! 65281 0xff01  
34 0x22 " 65282 0xff02 ダブルクォートは左、右版もある
35 0x23 # 65283 0xff03  
36 0x24 $ 65284 0xff04  
37 0x25 % 65285 0xff05  
38 0x26 & 65286 0xff06  
39 0x27 ' 65287 0xff07 シングルクォートは左、右版もある 
40 0x28 ( 65288 0xff08  
41 0x29 ) 65289 0xff09  
42 0x2a * 65290 0xff0a  
43 0x2b + 65291 0xff0b  
44 0x2c , 65292 0xff0c  
45 0x2d - 65292 0xff0d ハイフン・マイナス、他類似文字あり
46 0x2e . 65294 0xff0e  
47 0x2f / 65295 0xff0f  
48 0x30 0 65296 0xff10  
49 0x31 1 65297 0xff11  
50 0x32 2 65298 0xff12  
51 0x33 3 65299 0xff13  
52 0x34 4 65300 0xff14  
53 0x35 5 65301 0xff15  
54 0x36 6 65302 0xff16  
55 0x37 7 65303 0xff17  
56 0x38 8 65304 0xff18  
57 0x39 9 65305 0xff19  
58 0x3a : 65306 0xff1a  
59 0x3b ; 65307 0xff1b  
60 0x3c < 65308 0xff1c  
61 0x3d = 65309 0xff1d  
62 0x3e > 65310 0xff1e  
63 0x3f ? 65311 0xff1f  
64 0x40 @ 65312 0xff20  
65 0x41 A 65313 0xff21  
66 0x42 B 65314 0xff22  
67 0x43 C 65315 0xff23  
68 0x44 D 65316 0xff24  
69 0x45 E 65317 0xff25  
70 0x46 F 65318 0xff26  
71 0x47 G 65319 0xff27  
72 0x48 H 65320 0xff28  
73 0x49 I 65321 0xff29  
74 0x4a J 65322 0xff2a  
75 0x4b K 65323 0xff2b  
76 0x4c L 65324 0xff2c  
77 0x4d M 65325 0xff2d  
78 0x4e N 65326 0xff2e  
79 0x4f O 65327 0xff2f  
80 0x50 P 65328 0xff30  
81 0x51 Q 65329 0xff31  
82 0x52 R 65330 0xff32  
83 0x53 S 65331 0xff33  
84 0x54 T 65332 0xff34  
85 0x55 U 65333 0xff35  
86 0x56 V 65334 0xff36  
87 0x57 W 65335 0xff37  
88 0x58 X 65336 0xff38  
89 0x59 Y 65337 0xff39  
90 0x5a Z 65338 0xff3a  
91 0x5b [ 65339 0xff3b  
92 0x5c \ 65340 0xff3c "¥"は0xa5を使う
93 0x5d ] 65341 0xff3d  
94 0x5e ^ 65342 0xff3e  
95 0x5f _ 65343 0xff3f _  
96 0x60 ` 65344 0xff40  
97 0x61 a 65345 0xff41  
98 0x62 b 65346 0xff42  
99 0x63 c 65347 0xff43  
100 0x64 d 65348 0xff44  
101 0x65 e 65349 0xff45  
102 0x66 f 65350 0xff46  
103 0x67 g 65351 0xff47  
104 0x68 h 65352 0xff48  
105 0x69 i 65353 0xff49  
106 0x6a j 65354 0xff4a  
107 0x6b k 65355 0xff4b  
108 0x6c l 65356 0xff4c  
109 0x6d m 65357 0xff4d  
110 0x6e n 65358 0xff4e  
111 0x6f o 65359 0xff4f  
112 0x70 p 65360 0xff50  
113 0x71 q 65361 0xff51  
114 0x72 r 65362 0xff52  
115 0x73 s 65363 0xff53  
116 0x74 t 65364 0xff54  
117 0x75 u 65365 0xff55  
118 0x76 v 65366 0xff56  
119 0x77 w 65367 0xff57  
120 0x78 x 65368 0xff58  
121 0x79 y 65369 0xff59  
122 0x7a z 65370 0xff5a  
123 0x7b { 65371 0xff5b  
124 0x7c | 65372 0xff5c  
125 0x7d } 65373 0xff5d  
126 0x7e ~ 65374 0xff5e  
162 0xa2 ¢ 65504 0xffe0  
163 0xa3 £ 65505 0xffe1  
165 0xa5 ¥ 65509 0xffe5 \記号はこれを使う
166 0xa6 ¦ 65508 0xffe4  
167 0xa7 § 167 0xa7 § 1バイトで全角幅
168 0xa8 ¨ 168 0xa8 ¨ 1バイトで全角幅
172 0xac ¬ 65506 0xffe2  
173 0xad ­ 173 0xad ­ ソフトハイフン、1バイトで全角幅
175 0xaf ¯ 65507 0xffe3 マクロン
176 0xb0 ° 176 0xb0 ° 度、1バイトで全角幅
177 0xb1 ± 177 0xb1 ± 1バイトで全角幅
180 0xb4 ´ 180 0xb4 ´ アクセント、1バイトで全角幅
182 0xb6 182 0xb6 段落記号、1バイトで全角幅
215 0xd7 × 215 0xd7 × 乗算記号、1バイトで全角幅
247 0xf7 ÷ 247 0xf7 ÷ 除算記号、1バイトで全角幅
65377 0xff61 12290 0x3002  
65378 0xff62 12300 0x300c  
65379 0xff63 12301 0x300d  
65380 0xff64 12289 0x3001  
65381 0xff65 12539 0x30fb  
65382 0xff66 12530 0x30f2  
65383 0xff67 12449 0x30a1  
65384 0xff68 12451 0x30a3  
65385 0xff69 12453 0x30a5  
65386 0xff6a 12455 0x30a7  
65387 0xff6b 12457 0x30a9  
65388 0xff6c 12515 0x30e3  
65389 0xff6d 12517 0x30e5  
65390 0xff6e 12519 0x30e7  
65391 0xff6f 12483 0x30c3  
65392 0xff70 12540 0x30fc  
65393 0xff71 12450 0x30a2  
65394 0xff72 12452 0x30a4  
65395 0xff73 12454 0x30a6  
65396 0xff74 12456 0x30a8  
65397 0xff75 12458 0x30aa  
65398 0xff76 12459 0x30ab  
65399 0xff77 12461 0x30ad  
65400 0xff78 12463 0x30af  
65401 0xff79 12465 0x30b1  
65402 0xff7a 12467 0x30b3  
65403 0xff7b 12469 0x30b5  
65404 0xff7c 12471 0x30b7  
65405 0xff7d 12473 0x30b9  
65406 0xff7e 12475 0x30bb  
65407 0xff7f ソ 12477 0x30bd  
65408 0xff80 12479 0x30bf  
65409 0xff81 12481 0x30c1  
65410 0xff82 12484 0x30c4  
65411 0xff83 12486 0x30c6  
65412 0xff84 12488 0x30c8  
65413 0xff85 12490 0x30ca  
65414 0xff86 12491 0x30cb  
65415 0xff87 12492 0x30cc  
65416 0xff88 12493 0x30cd  
65417 0xff89 12494 0x30ce  
65418 0xff8a 12495 0x30cf  
65419 0xff8b 12498 0x30d2  
65420 0xff8c 12501 0x30d5  
65421 0xff8d 12504 0x30d8  
65422 0xff8e 12507 0x30db  
65423 0xff8f 12510 0x30de  
65424 0xff90 12511 0x30df  
65425 0xff91 12512 0x30e0  
65426 0xff92 12513 0x30e1  
65427 0xff93 12514 0x30e2  
65428 0xff94 12516 0x30e4  
65429 0xff95 12518 0x30e6  
65430 0xff96 12520 0x30e8  
65431 0xff97 12521 0x30e9  
65432 0xff98 12522 0x30ea  
65433 0xff99 12523 0x30eb  
65434 0xff9a 12524 0x30ec  
65435 0xff9b 12525 0x30ed  
65436 0xff9c 12527 0x30ef  
65437 0xff9d 12531 0x30f3  
65438 0xff9e 12443 0x309b  
65439 0xff9f 12444 0x309c  

 半角・全角変換での留意点
  ・基本ラテン文字(半角スペースを除く 0x21~0x7e)の全角コードは連続性があり、次の式で変換できる
     全角コード = 半角コード - 0x20 + 0xff00

  ・ラテン1補助文字(C1を除く 0x80~0xff)は次の文字のみ変換対応すればよい
   '¢' 0xa2 ⇒ 0xffe0
   '£' 0xa3 ⇒ 0xffe1
   '¥' 0xa5 ⇒ 0xffe5
   '¦' 0xa6 ⇒ 0xffe4
   '¬' 0xac ⇒ 0xffe2
   '¯' 0xaf ⇒  0xffe3

 ・半角カタカナは、半角コードが連続性があるのに対し、全角コードは連続性がないので変換のためのテーブルが必要となる
  1バイトコードのテーブル(配列)を用意して、次のように参照すれば変換できますね

kana_h2z_table = (
 0x02,0x0c,0x0d,0x01,0xfb,0xf2,0xa1,0xa3,
 0xa5,0xa7,0xa9,0xe3,0xe5,0xe7,0xc3,0xfc,
 0xa2,0xa4,0xa6,0xa8,0xaa,0xab,0xad,0xaf,
 0xb1,0xb3,0xb5,0xb7,0xb9,0xbb,0xbd,0xbf,
 0xc1,0xc4,0xc6,0xc8,0xca,0xcb,0xcc,0xcd,
 0xce,0xcf,0xd2,0xd5,0xd8,0xdb,0xde,0xdf,
 0xe0,0xe1,0xe2,0xe4,0xe6,0xe8,0xe9,0xea,
 0xeb,0xec,0xed,0xef,0xf3,0x9b,0x9c,
)

全角カタカナコード = kana_h2z_table[半角カタカナコード - 0xff61] + 0x3000

« 明けましておめでとう! | トップページ | Raspberry Pi Pico MicroPython用美咲フォントライブラリの更新 »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« 明けましておめでとう! | トップページ | Raspberry Pi Pico MicroPython用美咲フォントライブラリの更新 »