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

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

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

Re[9]: 外字印字のフォント


(過去ログ 135 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■79406 / inTopicNo.1)  外字印字のフォント
  
□投稿者/ furu (51回)-(2016/03/31(Thu) 11:47:41)

分類:[C#] 

VS2012 C#4.0

外字印字の文字化けで困っています。
プログラムで以下のことを実現する方法を知りたいです。

1.ある文字が指定のフォントで印字可能か判断
2.ある文字が印字できるフォントを検索

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

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

WindowsAPIでもかまいません。

よろしくお願いします。
引用返信 編集キー/
■79407 / inTopicNo.2)  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 バージョンの違いも考慮する必要があったりするわけで。
引用返信 編集キー/
■79408 / inTopicNo.3)  Re[2]: 外字印字のフォント
□投稿者/ furu (52回)-(2016/03/31(Thu) 14:12:43)
No79407 (魔界の仮面弁士 さん) に返信

>>外字の例
>>  じゃんけんのグー(U+270A)
>>  吉野家のつちよし(U+20BB7)
>
> それらは外字では無いですよね…?
>

魔界の仮面弁士さん、失礼しました。

外字の定義を書くべきでした。

例を挙げたので大丈夫だと思っていましたが
ここでの外字とは、いわゆる機種依存文字の事で
一部のフォントでは文字化けしてしまう文字です。

ですので、すべてコード範囲にあり
フォントを変えれば印字できるかもしれない文字です。

>>2.ある文字が印字できるフォントを検索
>
> これってコードポイントの話でしょうか。それともグリフの話?
>
> たとえば、Webdings などの記号フォントをどう扱うのか、
> "a" の文字を "A" の字形でレンダリングするフォントをどうするか、
> フォントリンクを考慮するのか、合字判定をどうするか、
> JIS90フォントとJIS2004フォントの差異などなど、いろいろと
> 考えうる条件はありますが、いずれにしろ簡単では無いように思います。
>

いろいろ考えると難しいので、単純に未登録ならば印字不可という判断で
いきたいと思います。例えば、「つちよし」が「吉」で印字されてもOK。
とにかく「・」,「 」,「●」,「?」で印字されると困ります。

> それはフォントリンクの働きですね。
> 下記の場所で定義されています。
>
> HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink
>

調べてみます。


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

何が来るかわからないので、変換テーブルは難しいです。

引用返信 編集キー/
■79409 / inTopicNo.4)  Re[3]: 外字印字のフォント
□投稿者/ 魔界の仮面弁士 (675回)-(2016/03/31(Thu) 14:48:39)
2016/03/31(Thu) 15:00:06 編集(投稿者)

No79408 (furu さん) に返信
> ここでの外字とは、いわゆる機種依存文字の事で

「印字」というので、人名などの厳密な表記を求めているのかと
想像しましたが、さほど厳密な定義を求めているわけではないのですね。


> 一部のフォントでは文字化けしてしまう文字です。

これも、厳密に捉えると定義が難しいのですよね。

日本語非対応のフォント、たとえば記号フォントである Webdings 等を
どう捉えるかという話になりますし、たとえ「MS 明朝」に限定しても、
バージョンごとの差異があるわけで。
https://ja.wikipedia.org/wiki/MS_%E6%98%8E%E6%9C%9D


> ですので、すべてコード範囲にあり
> フォントを変えれば印字できるかもしれない文字です。

「MS P明朝」で表示できない文字でも、
「Arial Unicode MS」「メイリオ」「游明朝」などでは
対応しているケースがありますね。フォントバージョンにもよりますが。


> いろいろ考えると難しいので、単純に未登録ならば印字不可という判断で
> いきたいと思います。

だとすると、cmap かな…。
入れ違いで先の回答 No79407 を編集してしまいましたが、
そこで紹介した URL を調べて見てください。

概念的にはこのあたり。
http://www.morisawa.co.jp/culture/dictionary/1921


> 例えば、「つちよし」が「吉」で印字されてもOK。
これは、字形には拘らない、という意味でしょうか。

類似字形なら、コードポイントが異なっても良いとなると、
「♯」を「井」や「#」で印字しても OK という意味に
なってしまいますね。(Wave Dash 問題のように)
今回はそういう話では無いのでしょうけれども。


> とにかく「・」,「 」,「●」,「?」で印字されると困ります。

対応文字数の多いフォントを購入するのも手かと思います。
引用返信 編集キー/
■79410 / inTopicNo.5)  Re[4]: 外字印字のフォント
□投稿者/ 魔界の仮面弁士 (676回)-(2016/03/31(Thu) 14:53:49)
2016/03/31(Thu) 14:54:35 編集(投稿者)

No79409 (魔界の仮面弁士) に追記
> だとすると、cmap かな…。

cmap に関する過去ログ。

>> [2009/10/21 14:34:17] No42796 『フォントファイルからcmapの情報を取得する方法について』
http://bbs.wankuma.com/index.cgi?mode=al2&namber=42796&KLOG=73



No42957 (たくボンさん) に追記
> 取得の方法は、
> http://support.microsoft.com/default.aspx/kb/241020/ja
上記 URL だと繋がらなくなっているようなので、
 https://support.microsoft.com/ja-jp/kb/241020
をご利用ください。
引用返信 編集キー/
■79411 / inTopicNo.6)  Re[5]: 外字印字のフォント
□投稿者/ Jitta (186回)-(2016/03/31(Thu) 17:18:32)
https://rakuzanet.jp/windows-gaiji.html
「アプリケーションやフォントにより、使える漢字が異なってくる?」みたいな話?
引用返信 編集キー/
■79412 / inTopicNo.7)  Re[6]: 外字印字のフォント
□投稿者/ furu (53回)-(2016/03/31(Thu) 18:21:50)
No79411 (Jitta さん) に返信
> https://rakuzanet.jp/windows-gaiji.html
> 「アプリケーションやフォントにより、使える漢字が異なってくる?」みたいな話?
そうです。
最初に入力した本人は表示されているので、
そんな文字を入れたつもりはないのですが
印字処理するコンピュータやプリンタにより
印字できない文字が出てきてしまいます。

「Segoe UI Symbol」だと、じゃんけんのグー,チョキ,パーが印字(表示)できますが
「MS Pゴシック」だと、チョキしか印字(表示)できません。
(チョキはピースだから入った?)

JIS第2水準に限れば、入力時にチェックもしやすいのですが
昨今、そうも言ってられなくて、なんでも入ってきます。

引用返信 編集キー/
■79415 / inTopicNo.8)  Re[7]: 外字印字のフォント
□投稿者/ 魔界の仮面弁士 (677回)-(2016/03/31(Thu) 19:40:58)
No79412 (furu さん) に返信
> 「Segoe UI Symbol」だと、じゃんけんのグー,チョキ,パーが印字(表示)できますが
> 「MS Pゴシック」だと、チョキしか印字(表示)できません。

とりあえず、これで判定できるかも。


'参照設定「PresentationCore.dll」

Dim fontFamilyTypefaceName As String = "MS ゴシック"
Dim character As Char = ChrW(&H337B)

Dim tf As New System.Windows.Media.Typeface(fontFamilyTypefaceName)
Dim gt As New System.Windows.Media.GlyphTypeface()
If tf.TryGetGlyphTypeface(gt) Then
 Dim map As IDictionary(Of Integer, UShort) = gt.CharacterToGlyphMap
 Dim p As Integer = AscW(character)
 If map.ContainsKey(p) Then
  MessageBox.Show("利用可能:" & CStr(map(p)))
 Else
  MessageBox.Show("利用不可")
 End If
Else
 MessageBox.Show("取得失敗")
End If



ただ、フォントごとのチェックは、あまり意味がないかもしれません。

仮に
>> 2.ある文字が印字できるフォントを検索
が可能だったとしても、各フォントは必ずしも包含関係には無いためです。

文章の一部はこっちのフォント、残りの部分はあっちのフォントといったかんじで
一文字ごとにフォントを切り替えてレンダリングするわけにもいきませんよね。


アプリで表示できる文字を増やしたいのなら、対応文字の多いフォントを購入するなり、
複数フォントをフォントリンクで補間させるなり(ソフト側の対応も必要)、
環境整備も含めた準備が必要かと思います。

さもなくば、そのアプリで利用可能な文字集合をあらかじめ定義しておき、
そこから外れた物は、印字結果を保証できない or 入出力を制限するなど、
いずれにせよ、泥臭い対応になってしまうのではないでしょうか。


> JIS第2水準に限れば、入力時にチェックもしやすいのですが
> 昨今、そうも言ってられなくて、なんでも入ってきます。

今も昔も、悩ましい問題ではありますね…。

昔は昔で、三重複文字(¬∵)や二重複文字(≒≡∫√⊥∠∩∪)などの
変換問題があったりしましたし。(特に、PC-9800版のWindows 95)
https://support.microsoft.com/ja-jp/kb/170559
引用返信 編集キー/
■79424 / inTopicNo.9)  Re[8]: 外字印字のフォント
□投稿者/ furu (54回)-(2016/04/01(Fri) 09:57:31)
No79415 (魔界の仮面弁士 さん) に返信

魔界の仮面弁士 さん
ありがとうございます。

> とりあえず、これで判定できるかも。

やってみます。

> 文章の一部はこっちのフォント、残りの部分はあっちのフォントといったかんじで
> 一文字ごとにフォントを切り替えてレンダリングするわけにもいきませんよね。

実は、一文字ごとのフォント切り替えを考えていました。
例えば、「メイリオ」を指定されていた場合、
「メイリオ」で印字できない文字だけ、
形が違ってでも、1文字だけか1行だけ、他のフォントで印字します。

1万文字印字で1文字あるかないかぐらいなので
それほど問題にならないと思っています。

> さもなくば、そのアプリで利用可能な文字集合をあらかじめ定義しておき、
> そこから外れた物は、印字結果を保証できない or 入出力を制限するなど、
> いずれにせよ、泥臭い対応になってしまうのではないでしょうか。

形はどうあれ、宛名印字など、印字してほしいと要望も多くて。

> 今も昔も、悩ましい問題ではありますね…。
>
> 昔は昔で、三重複文字(¬∵)や二重複文字(≒≡∫√⊥∠∩∪)などの
> 変換問題があったりしましたし。(特に、PC-9800版のWindows 95)
> https://support.microsoft.com/ja-jp/kb/170559

そうですね。
半角カナがドイツ語のウムラウトになってしまったり、
半角円記号と半角バックスラッシュは今でも悩ましいです。
引用返信 編集キー/
■79428 / inTopicNo.10)  Re[9]: 外字印字のフォント
□投稿者/ 魔界の仮面弁士 (680回)-(2016/04/01(Fri) 11:38:02)
2016/04/01(Fri) 11:40:41 編集(投稿者)

No79424 (furu さん) に返信
>>とりあえず、これで判定できるかも。

しまった…入力を Char にしてしまったので、
これだと U+20BB7(つちよし)などを判定できませんね。

手順は伝わったと思いますので、適宜読み替えてくださいませ。


> やってみます。

InstalledFontCollection と CharacterToGlyphMap を使って、
手元の環境(Win7)にインストール済みのフォントを調べてみました。

収録グリフ数だけなら中文系フォントが最多ですね。
……それが日本語表示に適しているかは別として。

42934文字 MingLiU-ExtB/MingLiU_HKSCS-ExtB/PMingLiU-ExtB
42807文字 SimSun-ExtB
38917文字 Arial Unicode MS
33860文字 MingLiU_HKSCS
29109文字 Microsoft YaHei/Microsoft YaHei UI
29058文字 Microsoft JhengHei/Microsoft JhengHei UI
28974文字 MingLiU/PMingLiU
28715文字 NSimSun/SimSun
28522文字 FangSong/KaiTi/SimHei
22185文字 DFKai-SB
20609文字 Batang/BatangChe/Dotum/DotumChe/GulimChe/Gungsuh/GungsuhChe/Gulim
16937文字 Meiryo UI/メイリオ
16510文字 Yu Gothic UI/Yu Gothic UI Light/Yu Gothic UI Semibold/Yu Gothic UI Semilight
16508文字 游ゴシック/游ゴシック Light/游ゴシック Medium
16127文字 游明朝/游明朝 Demibold/游明朝 Light
16051文字 MS UI Gothic/MS ゴシック/MS 明朝/MS Pゴシック/MS P明朝



> 1万文字印字で1文字あるかないかぐらいなので
> それほど問題にならないと思っています。

とはいえ、各フォントの対応状況を逐次チェックしていては
印字速度に影響してしまいますので、先にも述べたように
あらかじめ変換テーブルを用意しておくことをお奨めします。

あるいはフォントリンクで済ませることができるのなら、
それが一番手っ取り早いのかもしれません。


> 形はどうあれ、宛名印字など、印字してほしいと要望も多くて。

案件によっては、人名・地名用の外字(あるいは変換 API)を
販売している業者に相談するという選択肢もあるかと。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -