C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 135 を表示中)
■79407 / )  Re[1]: 外字印字のフォント
□投稿者/ 魔界の仮面弁士 (674回)-(2016/03/31(Thu) 13:17:39)
2016/03/31(Thu) 14:30:35 編集(投稿者)

No79406 (furu さん) に返信
> 外字印字の文字化けで困っています。

外字ファイルは、全フォントに共通して割り当てる場合と
フォントごとに個別に割り当てる場合があります。
(複数のフォントで、同じファイルを利用する事もあります)

外字ファイルの差し替えは、EnableEUDC API でオン/オフしてから
行う事になりますが、外字ファイルを他の PC にコピーして使う運用は
公式には保証外のようです。現実には、同じファイルを使う運用は多そうですが。



> ある文字が指定のフォントで印字可能か判断
フォント個別の割り当ては、
 HKEY_CURRENT_USER\EUDC\932
を見れば分かりますが、そこまでですね。
特定のコードに割り当てられた文字が、『ユーザーが望んでいるグリフ』で
あるの否かは機械的には判読できず、目検確認になってしまうでしょう。

割り当てそのものは… CMap テーブルを見れば分かりそうな気もしますが、
詳しく調べた事がないので確証はありません。済みません。
調べるためのマネージ実装があるかどうかも分からないです。
https://www.microsoft.com/typography/otspec/cmap.htm
https://msdn.microsoft.com/ja-jp/library/cc448060.aspx


> 外字の例
>   じゃんけんのグー(U+270A)
>   吉野家のつちよし(U+20BB7)

それらは外字では無いですよね…?

たとえば、上記例の U+270A (RAISED FIST) は、
 i-mode … F8F4
 EZweb … F488
 SoftBank … F950
のように割り当てられていますね


そもそも Unicode の私用領域は
 E000〜F8FF (Private Use Area)
 F0000〜FFFFF (Supplementary Private Use Area-A)
 100000〜10FFFF (Supplementary Private Use Area-B)
と定められています。(ただし U+nFFFE と U+nFFFF は非文字として予約)

JIS 全角文字の場合は 95〜114区(7F21〜927E)。
これは CP932(Shift_JIS) でいう F040〜F9FC にあたります。


> メールなどでは、「MS P明朝」フォントを
> 指定していてもちゃんと表示しているので
> 可能だとは思うのですが方法がわかりません。

それはフォントリンクの働きですね。
下記の場所で定義されています。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink


> 2.ある文字が印字できるフォントを検索

これってコードポイントの話でしょうか。それともグリフの話?


たとえば、Webdings などの記号フォントをどう扱うのか、
"a" の文字を "A" の字形でレンダリングするフォントをどうするか、
フォントリンクを考慮するのか、合字判定をどうするか、
JIS90フォントとJIS2004フォントの差異などなど、いろいろと
考えうる条件はありますが、いずれにしろ簡単では無いように思います。


特定の文字集合に含まれているかどうかを判断したいという話であれば、
とりあえず手抜き実装として System.Text.Encoding.GetEncoding メソッドの
第2、第3引数に「{Encodder|Decoder}ExceptionFallback」クラスを
割り当てれば、変換できないコードポイントを調べる事ができます。
(特定のフォントで描画できるかどうかは、また別の話)

ただ、この Fallback を使う方法も、OS や .NET のバージョンで動作が
変わるので、厳密なチェックにはなりえません。厳密な判定が必要な場合は
変換テーブルを用意するのが確実だと思います。

処理系によっては、Unicode バージョンの違いも考慮する必要があったりするわけで。
返信 編集キー/


管理者用

- Child Tree -