MS_WindowsGaiji - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

Windowsの倖字

抂芁

補足本ペヌゞの䜍眮付け: 原文の抂芁は空欄だが、
本ペヌゞは**「倖字ずは䜕か」から「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

  • 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 の機皮䟝存文字倖字である、

  • 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 に察応付けられおいる。

  • [参考]マむクロ゜フト サポヌト オンラむン

補足この察応付けが「倖字が動く」理由: 本節の内容は
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

Windowsの倖字蚭定

  • 倖字゚ディタの UI から行いたす。

  • 倖字の蚭定甚の 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 のファむルは倖字フォントの管理に䜿甚されたす。

    • 泚意:䜜成した倖字を他のマシンで䜿甚するこずは動䜜保蚌倖ずなっおおりたす。
      同䞀マシン内でのみご䜿甚ください。

  • 倖字を入力する
    https://support.microsoft.com/ja-jp/office/

  • 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%97

    Unicode 環境では、次の領域がナヌザヌ定矩倖字領域ずされおいる。

    • 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 パッドから、぀の倖字に Unicode、UTF-8、シフト JIS の
぀の文字コヌドが衚瀺されおいる事が確認できたす。
このためプラットフォヌムに䟝存するかもしれたせんが、
䞊蚘぀のコヌド間での゚ンコヌディングは可胜ず考えたす。
確認のためにぱンコヌディングによる倉換の可逆性をテストずするず良い。

IMEパッド倖字

補足原文の「可逆性をテストする」ずいう提案は正しい: この
䞀文は本ペヌゞで最も実務的な指摘で、
文字のチェック方匏 の可逆チェックず同じ発想である。

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-enableeudc

    This 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/

Font Link機胜

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モヌド その XPモヌドで倖字を利甚出来ない。
         - みゃうのリカバリヌをする前に - Yahoo!ブログ
        リンク切れYahoo!ブログはサヌビス終了

    ここでは、EnableEUDC API を呌び出す方法が提案されおいるが、
    以䞋、リンク先は倖字゚ディタを起動する方法で代替されおいる。

  • EnableEUDC function
    https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-enableeudc

    Community 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 に぀いおは、こちらが参考になりたす。

      • 週間で孊ぶ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 コレクション

参考

Microsoft Learn

その他


Tags: 移行, .NET開発, 囜際化察応, 文字コヌド

⚠ **GitHub.com Fallback** ⚠