-
Notifications
You must be signed in to change notification settings - Fork 0
MS_WindowsGaiji
補足(本ページの位置付け): 原文の概要は空欄だが、
本ページは**「外字とは何か」から「Windows での運用上の落とし穴」まで**を
一通り扱った、実務的な調査記録である。【本ページの構成】 前提知識 …… 外字とは何か。文字コード上のどこに置かれるか 基本情報 …… 外字エディタ、外字ファイル(*.TTE / *.EUF) 問題と対策 … Session 0 分離の問題、帳票印刷の問題 ★ ここが本題**「Session 0 分離により、サービスから外字が使えない」**という
節の指摘が、本ページで最も価値のある部分である。
帳票をサーバ側で生成するシステムで実際に踏む問題であり、
現在も同じ制約が残っている。**なお、現在の設計指針は「外字を新規に使わない」**である。
理由は本ページ自身が繰り返し述べている通りで、・別環境とデータ交換できない(コードの意味が環境ごとに違う) ・Microsoft が【他マシンへの移植をサポート外】としている ・PDF・印刷・Web で表示できないことがある ・サービス(Session 0)から使えない**代替は IVS(異体字セレクタ)**である
(JIS文字・漢字コード)。
既存資産としての外字を運用・移行する際の参考として本ページを読むのがよい。
外字(環境依存文字)とは、
- 一般的な文字集合(キャラクタ セット)に含まれない文字のことをいう。
- 日本で一般には、JIS 規格の文字コード
(通常は JIS X 0208、稀に JIS X 0213 や JIS X 0221)に含まれない文字のことを指す。 - 外字は、あらかじめどのコードにどの文字を入れているかを同期させている場合を除き、
別の環境とのデータのやり取りができない。そのため、外字を使用することは好ましくないとされる。 - メーカなどがシステムにあらかじめ組み込んでいた外字を
システム外字(ベンダ定義文字)と呼び、
個々のユーザが作成した外字はユーザ外字(ユーザ定義文字)と呼ぶ。
- JIS X 0208 : 1997
0xF000 ~ 0xFFFC に外字を入れることを原則禁止 - JIS X 0213 : 2000
0xF000 ~ 0xFFFC の領域を外字領域として使用 - JIS X 0221 (Unicode)
以下の領域を外字領域として使用- U+E000 ~ U+F8FF、
- U+000F0000 ~ U+000FFFFD、
- U+00100000 ~ U+0010FFFD
移行メモ(JIS X 0213 の記述が逆): 原文の 2 行目は
「0xF000 ~ 0xFFFC の領域を外字領域として使用」とあるが、
JIS X 0213 は、この領域を
第 3・第 4 水準の「正規の文字」に割り当てた規格である
(=外字領域として使えなくなった)。【Shift_JIS の 0xF040~0xF9FC(従来の外字領域)】 JIS X 0208 の運用 … 外字(ユーザ定義)として使われてきた JIS X 0208:1997 … 「外字を入れるのは原則禁止」と明記 JIS X 0213:2000/2004 … 【第3・第4水準漢字を割り当てた】★ → Shift_JIS-2004 では、従来の外字と【衝突する】 → もっとも Windows は Shift_JIS-2004 を採用しなかったため、 CP932 上では従来通り外字領域のまま残ったつまり、原文の 1 行目・2 行目は
**「JIS が外字領域をなくす方向へ動いた」**という同じ流れを示している。
Windows がその流れに乗らなかったため、
現在も CP932 の外字が使えている、という構図である。
Windows の機種依存文字(外字)である、
- Windows の外字(環境依存文字)
- システム外字(ベンダ定義文字)
- ユーザ外字(ユーザ定義文字)
の外字は、Shift_JIS の 0xF040 ~ 0xF9FC は Unicode の U+E000 ~ U+E757 に
順番に対応付けられている(Shift_JIS で 0xF07F などの使用不可能なコードポイントは飛ばす)。
このため、Windows 中では、
- 外字(環境依存文字)
- システム外字(ベンダ定義文字)
- ユーザ外字(ユーザ定義文字)
の Unicode ⇔ Shift_JIS のエンコーディングがサポートされる。
Windows 付属の外字エディタでは U+E758~U+F8FF にも外字を作成可能であるが、
そこに作成したものは Unicode 環境でのみ使用可能となる。
なお、Wingdings などのシンボルフォントのグリフは
Unicode では U+F020 ~ U+F0FF に対応付けられている。
- [参考]:マイクロソフト サポート オンライン
- [IME] 外字エディタを使用して外字を作成する方法
http://support.microsoft.com/kb/416747/ja - Unicodeの私用領域U+F020-U+F0FFの範囲がシンボルフォント用に使用されている
http://support.microsoft.com/kb/900284/ja
- [IME] 外字エディタを使用して外字を作成する方法
補足(この対応付けが「外字が動く」理由): 本節の内容は
Windows で外字が実用になっている仕組みの核心であり、正確である。【Shift_JIS(CP932)の外字領域 → Unicode 私用領域】 0xF040 → U+E000 0xF041 → U+E001 ⋮ ⋮ 0xF07E → U+E03E (0xF07F は Shift_JIS の 2 バイト目に使えないので飛ばす) 0xF080 → U+E03F ⋮ ⋮ 0xF9FC → U+E757 合計 1,880 字この対応表は Microsoft が定めたものであり、
他社の変換ライブラリでは違う値になり得る。
したがって、**「外字が化ける」のではなく
「外字のコードは通るが、字が違う」**という現象が起きる。U+E758~U+F8FF に作った外字の制約(原文の指摘の通り):
・Shift_JIS に対応するコードがない → CP932 に変換した時点で失われる("?" になる) ・したがって、Unicode で一貫したシステム内でしか使えない ・逆に言えば、【全体が UTF-8 なら 6,400 字まで使える】シンボル フォント(Wingdings 等)が U+F020~U+F0FF を使う
という点も、実務上の落とし穴である。・外字をこの範囲に作ると、シンボル フォントと【衝突する】 ・Word の箇条書き記号などがこの範囲を使う → 文書をコピーすると、意図しない文字が混ざる
-
文字コード - Wikipedia > 外字
https://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89#外字 -
マイクロソフト標準キャラクタセット - Wikipedia
https://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88%E6%A8%99%E6%BA%96%E3%82%AD%E3%83%A3%E3%83%A9%E3%82%AF%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88マイクロソフト標準キャラクタセットは、Windows において特別なフォントを
自前で用意することなく表示できる日本語の文字集合のことである。
-
外字エディタの UI から行います。
-
外字の設定用の Win32 API は存在しないようです。
-
外字設定は外字ファイルに反映されるので、外字ファイルの差替えで設定可能です。
-
マイクロソフトは、作成した外字を他のマシンで使用することをサポート外としています。
- しかし、プログラム(Win32 API)からの設定方法は存在しないため、
設定作業を自動化する場合は、ファイルの差替えで対応するしかありません。
このため、このような外字差し替え操作はセルフサポート(自己責任)で行う必要があります。
- しかし、プログラム(Win32 API)からの設定方法は存在しないため、
補足(この状況は現在も変わっていない): 外字を作成・登録する
公式な API は、現在も提供されていない。
現在 外字エディタ( eudcedit.exe)Windows 11 にも同梱されている(変わらず) 作成用 API なし(変わらず) 有効化 API EnableEUDCはある(後述)他マシンへの移植 サポート外(変わらず) つまり、外字の配布・展開は 20 年以上「ファイルを配る」しかない
という状態が続いている。【実務での配布方法】 ① 外字ファイル(EUDC.TTE / EUDC.EUF)を作る ② グループ ポリシー / 資産管理ツール / ログオン スクリプトで配布 ③ レジストリの EUDC キーを設定 HKEY_CURRENT_USER\EUDC\<コードページ> ④ EnableEUDC で有効化、またはログオンし直す → いずれも【サポート外】の運用であるこの運用負荷の高さが、「外字を使わない」方向へ進む理由である。
JIS文字・漢字コード で触れた IVS なら、
フォントを入れるだけ(外字の登録作業が不要)で済む。
-
外字エディタを使用して外字を作成する方法
http://support.microsoft.com/kb/881004/ja -
Windows で外字エディタを使用して外字を作成する方法
http://support.microsoft.com/kb/416747/ja-
作成した外字は登録するフォントごとに *.TTE、*.EUF ファイルに格納されます。
-
外字作成時に [すべてのフォントにリンクする] を選択した場合には、
EUDC.TTE、および EUDC.EUF という名前のファイルに格納されます。 -
外字作成時に [指定したフォントにリンクする] を選択した場合には、
任意のファイル名で拡張子が .TTE、.EUF の各ファイルに格納されます。 -
拡張子が .TTE のファイルは外字フォントのデータが格納され、
.EUF のファイルは外字フォントの管理に使用されます。 -
注意:作成した外字を他のマシンで使用することは動作保証外となっております。
同一マシン内でのみご使用ください。
-
-
IME 2003 または IME 2002 で外字を入力する方法
http://support.microsoft.com/kb/881005/ja
補足(「すべてのフォントにリンク」と「指定したフォントにリンク」): この
選択は、運用の性質を大きく変えるため補足しておく。
方式 格納先 性質 すべてのフォントにリンク EUDC.TTE/EUDC.EUFどのフォントでも同じ字形で出る。管理が簡単 指定したフォントにリンク 任意の名前の .TTE/.EUFフォントごとに字形を作れる(明朝/ゴシック) 【格納場所】 %WINDIR%\Fonts\EUDC.TTE (システム) HKEY_CURRENT_USER\EUDC\932 (レジストリ。ユーザーごと) → 【ユーザーごとの設定である】点が最重要 = 別のユーザーでログオンすると外字が見えない = サービス アカウントでは見えない ★ 後述の Session 0 問題帳票を扱うシステムでは「指定したフォントにリンク」が必要になる。
明朝で印刷する帳票に、ゴシックの外字が混ざると目立つためである。
ただし、フォントの数だけ外字を作ることになり、作成工数が増える。
-
ユーザー定義外字 ‐ 通信用語の基礎知識
https://www.wdic.org/w/WDIC/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%AE%9A%E7%BE%A9%E5%A4%96%E5%AD%97Unicode 環境では、次の領域がユーザー定義外字領域とされている。
- BMP 領域 U+E000‐U+F8FF (6,400字)
- 15面 U+F0000‐U+FFFFD (65,534字)
- 16面 U+100000‐U+10FFFD (65,534字)
シフト JIS の 0xF040~0xF9FC は、U+E000~U+E757 に割り当てられている。
Windows の外字エディタは、文字セットを Unicode にすると U+E000~U+F8FF までを
利用できるが、U+E758~U+F8FF はシフト JIS では表現できないため Unicode 専用となる。
IME パッドから、1つの外字に Unicode、UTF-8、シフト JIS の
3つの文字コードが表示されている事が確認できます。
このため(プラットフォームに依存するかもしれませんが、)
上記3つのコード間でのエンコーディングは可能と考えます。
#確認のためにはエンコーディングによる変換の可逆性をテストとすると良い。

補足(原文の「可逆性をテストする」という提案は正しい): この
一文は本ページで最も実務的な指摘で、
文字のチェック方式 の可逆チェックと同じ発想である。Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); var cp932 = Encoding.GetEncoding(932); string gaiji = "\uE000"; // 外字の 1 字目 byte[] b = cp932.GetBytes(gaiji); // F0 40 string back = cp932.GetString(b); // U+E000(戻る) Console.WriteLine(back == gaiji); // True ← 可逆 string gaiji2 = "\uE758"; // Shift_JIS に対応がない範囲 Console.WriteLine(cp932.GetString(cp932.GetBytes(gaiji2)) == gaiji2); // False ← 失われる「U+E000~U+E757 は可逆、U+E758 以降は不可逆」——
という境界が、コードで確認できる。注意すべき点:
・可逆であることと、【同じ字形が出ること】は別問題 → コードは通っても、相手の環境に外字ファイルがなければ □ になる → 「エンコードできる」=「相手に伝わる」ではない
EnableEUDC 関数を使用する。
-
SDK32:外字ファイルを更新する方法
http://support.microsoft.com/kb/413278/ja外字ファイルを更新するときには、ファイルをコピーする前に、
EnableEUDC 関数の引数に FALSE を指定してシステムの外字の使用を一時停止し、
コピー終了後、EnableEUDC 関数の引数に TRUE を指定して外字の使用を再開します。
この操作を行なわないと、既に同じ名前のファイルがシステムに登録されている場合は、
ファイルのコピーが失敗し、同じ名前のファイルがない場合でも、
外字ファイルは、即座に更新されません。
EnableEUDC は、GDI32.LIB に登録されていないため、
実行時に関数のアドレスを取得する必要があります。 -
EnableEUDC function
https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-enableeudcThis function enables or disables support for end-user-defined characters (EUDC).
この機能は、外字のサポートを「有効」・「無効」にします。Community Additions(コミュニティー追加分)
Support for EUDC needs to be enabled and is a per-session setting.
外字のサポートは「有効」である必要があり、セッション毎のセッティングです。
補足(
EnableEUDCの呼び出し方): 原文が指摘する通り、
GDI32.LIBにエクスポートされていないため、
実行時に関数のアドレスを取得する必要がある。// C# から呼ぶ場合(P/Invoke ではなく動的に解決する) [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)] static extern IntPtr GetModuleHandle(string name); [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)] static extern IntPtr GetProcAddress(IntPtr hModule, string procName); delegate bool EnableEUDCDelegate(bool enable); static bool EnableEudc(bool enable) { var gdi32 = GetModuleHandle("gdi32.dll"); var addr = GetProcAddress(gdi32, "EnableEUDC"); if (addr == IntPtr.Zero) return false; var fn = Marshal.GetDelegateForFunctionPointer<EnableEUDCDelegate>(addr); return fn(enable); }注意点:
・【文書化されていない関数】である(Learn には項目があるが、 詳細な仕様・保証は乏しい) ・後述の通り【失敗することがある】 ・GDI(Win32 の描画)に対する設定であり、 WPF / DirectWrite 系には効かない場合がある ★最後の点が現在は重要である。
WPF、WinUI、ブラウザ、最近の PDF ライブラリは
GDI ではなく DirectWrite で描画するため、
EnableEUDCを呼んでも外字が出ないことがある。
-
外字をほかのパソコンに移したい - デジタル - 日経トレンディネット
(リンク切れ:http://trendy.nikkeibp.co.jp/article/qa/os/20030131/103639/)Windows は、「プログラム」メニュー→「アクセサリ」にある「外字エディタ」を使うことで、
ユーザー好みの字形を扱える「外字」を作成できます。しかし現在、マイクロソフトの方針では、
「作成した外字を他のマシンで使用することは動作保証外」です。
(Windows には外字を作成するための「外字エディタ」の機能がある。
作成された外字は EUDC などの名前が付いたファイルに保存される)
ただ、編集部で試したところ、外字を移せる場合もありました。
ご参考のために、その方法を以下に記述します。
ただし、これで外字が移せるとは限りません。
システムに不具合が出ない保証もありません。試す場合は自己責任となります。 -
外字をほかのパソコンに移す方法は?
(リンク切れ:http://pc.nikkeibp.co.jp/article/NPC/20060329/233790/)マイクロソフトでは、外字ファイルを他のパソコンで使用することはサポート対象外としています。
以下の手順で外字をほかのパソコンに移すことができますが、あくまでも自己責任となります。 -
外字コピー屋さん Version 2.5
http://www.eastvalley.or.jp/cpeudc/このソフトは外字ファイルが異なる OS で使用できることを保証するものではありません。
また、外字を他の PC で使用することや、異なる OS 間で共有することは、
マイクロソフトのサポート外のことですので、あくまでも自己責任の範囲でお使いください。
Windows でフォントをインストールまたは削除する方法
https://support.microsoft.com/ja-jp/windows/
Windows 2000-XPのFont Link機能(Font Linking)の紹介
(リンク切れ:http://blue.ribbon.to/~akene/fontlink.htm)
フォントの組み替えができる FontLink 機能(原語は ability) は、
どうやら英語版 Windows CE (iPAQ など) の日本語化ページでしか
紹介されてようなので、紹介ページを作ってみました。
Accessむかむか-[再起動しないで外字を設定する]
http://www.sanryu.net/acc/tips/tips161.htm
'MS P ゴシックにフォントをリンクする
補足(Font Link は現在も使われている): フォント リンクは、
あるフォントに字がない場合に、別のフォントで補う仕組みである。HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink "Tahoma" = "MSGOTHIC.TTC,MS UI Gothic" ↑ 英字フォントに日本語がないので、MS ゴシックで補う外字での使い道は、
【目的】 任意のフォント(游明朝など)で外字を表示させたい 【方法】 SystemLink に EUDC.TTE を追加する 【効果】 外字エディタで「すべてのフォントにリンク」しなくても、 特定フォントで外字が出るようになる現在の注意点:
・レジストリ変更なので、【グループ ポリシーでの展開が要る】 ・DirectWrite ベースのアプリでは【フォント フォールバックが別機構】 → WPF/WinUI では効かない場合がある ・Web ブラウザでは効かない(CSS の font-family で自分で並べる)Web での代替は CSS のフォント フォールバックである。
body { font-family: "游明朝", "MS 明朝", "MyGaijiFont", serif; } ↑ 外字用の Web フォント
Session 0 の問題
(Vista 以降のサービスでの外字利用)
-
なぜWindowsのログオンする際にCtrl + Alt + Delが必要? - 新日々此何有哉
https://kkamegawa.hatenablog.jp/entry/20100308/p1もうひとつ、意外と見落とされますが、外字(EUDC)があります。
外字は Windows のログオンユーザーごとに設定されます。
したがって「誰かがログオンしていないと外字が使えない」という現象が発生します。
これを救うための API である EnableEUDC なんてのも用意されています。・・・
したがって、サーバーで帳票を作るような場合、そして外字を使うようなシステムでは
日夜自動ログオンがあるとかないとか・・・。・・・
これも Windows Server 2008 でサービス(Session 0)と
ユーザーセッション(Session 1 以降)が分離されてしまったので、
サービスで外字を出したい場合は前述の EnableEUDC() を呼び出すことになります。
ただ、この API、そこそこ失敗するので、かなりどきどきです。 -
メモ。[Tips][Windows7]XPモードで、シームレスモードを利用すると外字が表示できない
(リンク切れ:http://d.hatena.ne.jp/nagasama/?of=18)-
シームレスモードでアプリケーションを動作させると外字が表示されないみたい。
-
XP モードのシームレスモードは、RemoteApp と同じ技術みたいだから、
RemoteApp でも同じことがおきるのではないか?
と思って試してみるとやっぱり外字が表示されない。 -
なるほど、「ユーザーがログオンしていないと使えない」、そして、
EnableEUDC API を呼び出させばよいのか!!ということで、KB413278 に
乗っているサンプルをそのまま使って、実行ファイルを作ってみた。
呼び出してみると、確かに外字がいきなり使えるようになった。 -
Vista 以降の場合は、Session 0 の分離よりサービスで外字を利用する場合は、
同様に表示されないから、EnableEUDC API を呼び出さなければならない。 -
なぜ外字エディタを起動しないとXP Modeで外字が表示されない?
https://kkamegawa.hatenablog.jp/entry/20091123/p1- Windows 7 の XP Mode で外字を使いたい場合: 世の中は不思議なことだらけ
http://snow-white.cocolog-nifty.com/first/2009/11/windows-7-xp-mo.html - Windows 7 XPモード その6 XPモードで外字を利用出来ない。
- みゃうのリカバリーをする前に - Yahoo!ブログ
(リンク切れ:Yahoo!ブログはサービス終了)
- Windows 7 の XP Mode で外字を使いたい場合: 世の中は不思議なことだらけ
ここでは、EnableEUDC API を呼び出す方法が提案されているが、
以下、リンク先は外字エディタを起動する方法で代替されている。 -
-
EnableEUDC function
https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-enableeudcCommunity Additions(コミュニティー追加分)
Support for EUDC needs to be enabled and is a per-session setting.
It can be turned on or off using the EnableEUDC Windows API.
It is enabled by default by userinit.exe, so usually, nothing needs to be done
for standard Windows apps. However, because of session 0 isolation,
services running on Windows Vista or later need to call EnableEUDC explicitly
otherwise EUDC support will be disabled.外字のサポートは(ログオン)セッション毎に「有効」である必要があります。
これは EnableEUDC Win32API を使用して ON・OFF できます。
通常、userinit.exe により ON に設定されるため、何も行う必要はありませんが、
Windows Vista 以降で動作するサービスは、
Session 0 隔離のために、
EnableEUDC を明示的に呼ばなければ、外字のサポートは無効になります。-
userinit.exe については、こちらが参考になります。
-
1週間で学ぶIT基礎の基礎
- Windowsユーザーのためのワンポイント・レッスン 第64回:ITpro
(リンク切れ:http://itpro.nikkeibp.co.jp/members/ITPro/ITBASIC/20050602/162002/)ログオン直後に起動するプロセスで、
ログオン・スクリプトやシェルを実行し、
各種ユーザー環境を初期化する機能を提供しています。
-
-
補足(この節が本ページの核心。現在も有効): Session 0 分離は
現行の Windows にもそのまま残っているため、
この問題は今も起きる。構造を整理する。【なぜサービスから外字が見えないのか】 ① 外字の設定は【HKEY_CURRENT_USER】にある → ユーザーごとの設定 ② 通常ログオン時、userinit.exe が EnableEUDC(TRUE) を呼ぶ → 対話ユーザーのセッションでは自動的に有効になる ③ Windows サービスは【Session 0】で動く(Vista 以降) → userinit.exe が動かない → EnableEUDC が呼ばれない → 外字が無効のまま ④ さらに、サービス アカウント(LocalSystem 等)の HKEY_CURRENT_USER には外字の設定自体がない現在の対策(原文の路線を踏まえて整理):
対策 内容 評価 EnableEUDC(TRUE)を呼ぶサービス起動時に明示的に呼ぶ 原文の通り。ただし失敗し得る サービス アカウントのレジストリに外字を登録 HKEY_USERS\<SID>\EUDC\932に設定確実性が高いが運用が煩雑 専用ユーザーで実行する サービスを通常ユーザーとして実行 外字の設定が引ける 外字を使わない IVS / 専用フォントに置き換える 本筋の解 ★ 帳票エンジンを分離 帳票サーバ(帳票出力)に任せる 責務が整理される 同じ問題が起きる場所(原文が XP Mode / RemoteApp で観察した通り):
・Windows サービス(バッチ、常駐処理) ・IIS のアプリケーション プール ★ 【Web アプリで帳票を作る場合】 ・タスク スケジューラ(「ユーザーがログオンしているかどうかに かかわらず実行する」設定の場合) ・RemoteApp / リモート デスクトップ セッション ・コンテナ(そもそも外字ファイルを入れる必要がある)IIS で帳票 PDF を生成するシステムは、この問題を高確率で踏む。
開発環境(デスクトップで動かす)では出るのに、
本番(IIS 配下)では外字が □ になるという形で表面化する。「そこそこ失敗する」(原文の引用)についての補足:
EnableEUDCはセッションごとの設定であるため、
呼ぶタイミングと、呼ぶスレッドのセッションが影響する。
また、GDI の描画にしか効かないため、
DirectWrite ベースのレンダラーでは効果がない。
確実性を求めるなら、レジストリを直接設定する方式の方が堅い。
Q:Adobe Reader で Windows 外字(EUDC.tte)6400 文字分を表示可能かどうか?
A:PDF 化するツールがサポートしているか、いないかが鍵であるようです。
-
PDF における外字のサポートについて
(リンク切れ:http://kb2.adobe.com/jp/cps/233/233284.html) -
PDF 作成時に日本語フォントを埋め込む方法(Windows 版 Acrobat 7.0-8)
(リンク切れ:http://kb2.adobe.com/jp/cps/225/225564.html)
補足(原文の結論は現在も正しい): 「PDF 化するツールが
サポートしているかが鍵」——この見立てはそのまま通用する。【PDF に外字を出すための条件】 ① フォントが埋め込まれること(Embed) → 埋め込まないと、閲覧側の環境に外字がなければ出ない ② PDF 生成ツールが【外字フォント(EUDC.TTE)を認識すること】 → GDI 経由で印刷するツールなら通ることが多い → 独自にフォントを読むツールは、明示的な指定が要る ③ ライセンス上、埋め込みが許可されていること → 商用フォントは埋め込み不可のものがある → 自作の外字は問題ない現在の状況:
生成方式 外字の扱い 仮想プリンタ(Microsoft Print to PDF 等) GDI 経由なので通りやすい。ただしサービスからは前述の問題 Word / Excel の PDF 出力 通る(Office が GDI/DirectWrite で描画) QuestPDF / PDFsharp フォント ファイルを明示的に指定すれば通る Chromium 系(Playwright / Puppeteer) CSS で外字フォントを指定すれば通る 帳票製品(ActiveReports 等) 製品側の外字対応機能を使う(各製品にある) Linux コンテナでの生成 外字ファイルを配置し、フォントとして登録する必要 // QuestPDF で外字フォントを明示的に登録する例 FontManager.RegisterFont(File.OpenRead(@"C:\Windows\Fonts\EUDC.TTE")); // 使う側 page.DefaultTextStyle(x => x.FontFamily("MS 明朝", "EUDC"));クラウド/ Linux へ移行する際に最も詰まるのがここである。
外字は Windows のローカル設定に強く依存するため、
コンテナ化・SaaS 化と相性が悪い。
移行を機に IVS へ寄せる判断が現実的である
(帳票出力)。
- 外字登録で一部の私用領域に登録した外字が正しく表示されない
http://support.microsoft.com/kb/418818/JA - 詳細な印刷機能を有効にして印刷すると外字が印刷されないことがある
http://support.microsoft.com/kb/2550834/ja
補足(外字を「やめる」ための移行手順): 既存システムの外字を
減らしていく際の、実務的な進め方をまとめる。① 【棚卸し】 実際に使われている外字を数える SELECT * FROM 顧客 WHERE 氏名 LIKE N'%[' + NCHAR(0xE000) + '-' + NCHAR(0xE757) + ']%' → 「6,400 字登録しているが、実際は 30 字しか使っていない」 というケースが多い ② 【分類】 各外字を以下に振り分ける (a) Unicode に【正規の文字として存在する】 → 置換できる ★大半 (b) IVS で表せる異体字 → IVS へ (c) Unicode にない → 外字を残す ③ 【変換表を作る】 外字コード → 置換後の文字 業務部門のレビューを受ける(氏名は特に慎重に) ④ 【データ変換】 変換表に従って一括更新 変換前後を必ず保存する(切り戻しのため) ⑤ 【残りの外字】 IVS 対応フォント + 外字フォントで運用② の (a) が大半を占めるのが実情である。
外字が作られた当時(Windows 95~XP 期)は
Unicode の CJK 拡張が未整備だったため、
今なら正規の文字で表せるものが多く外字にされている。参考になる対応表:
・MJ文字情報一覧表(IPA)… 約 6 万字。戸籍統一文字との対応あり ・住基ネット統一文字 ・Adobe-Japan1 の IVS コレクション
- EnableEUDC function
https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-enableeudc - サービスでの Session 0 分離の影響
https://learn.microsoft.com/ja-jp/windows/win32/services/interactive-services - Unicode と文字セットの使用
https://learn.microsoft.com/ja-jp/windows/win32/intl/unicode
- MJ文字情報一覧表(文字情報基盤整備事業 / IPA)
https://moji.or.jp/mojikiban/mjlist/
Tags: 移行, .NET開発, 国際化対応, 文字コード
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。