PostScript で 機種依存文字でも文字化けのないPDFを作る(Windows限定)。

今までは以下の理由でEUC-JPのフォントを使ってきました。

  • Shift-JIS は0x5cを含む文字が文字化けを起こす。
  • UTF-8 はデフォルトでインストールされていないこともある。

日本語文字列出力を参考に、EUC-JPでテキストを作り、/Ryumin-Light-EUC-H のように EUC-JPのフォントを指定してきたのです。

しかし、この設定ですと、㈱や①のようなWIndows 機種依存文字はRyumin-Light-EUC-Hに含まれていないために豆腐文字になってしまいます。業務に用いる帳票には機種依存文字が含まれていますので、そのまま印刷するのには不都合です。

昨日、C:\Program Files\Adobe\Reader 10.0\Resource\CMap の中を見ると「90ms」の文字があるのに気が付きました。

sirocco@sirocco-PC /C/Program Files/Adobe/Reader 10.0/Resource/CMap
$ ls
83pv-RKSJ-H     90pv-RKSJ-H      Adobe-Japan1-1  Adobe-Japan1-90ms-RKSJ  EUC-H       Identity-V        UniJIS-UCS2-V
90ms-RKSJ-H     90pv-RKSJ-UCS2   Adobe-Japan1-2  Adobe-Japan1-90pv-RKSJ  EUC-V       UCS2-90ms-RKSJ    UniJIS-UTF16-H
90ms-RKSJ-UCS2  90pv-RKSJ-UCS2C  Adobe-Japan1-3  Adobe-Japan1-H-CID      Ext-RKSJ-H  UCS2-90pv-RKSJ    UniJIS-UTF16-V
90ms-RKSJ-V     Add-RKSJ-H       Adobe-Japan1-4  Adobe-Japan1-H-Host     Ext-RKSJ-V  UniJIS-UCS2-H     UniJIS2004-UTF16-H
90msp-RKSJ-H    Add-RKSJ-V       Adobe-Japan1-5  Adobe-Japan1-H-Mac      H           UniJIS-UCS2-HW-H  UniJIS2004-UTF16-V
90msp-RKSJ-V    Adobe-Japan1-0   Adobe-Japan1-6  Adobe-Japan1-UCS2       Identity-H  UniJIS-UCS2-HW-V  V

ms はきっと Microsoftのことで、MS-Mincho-90ms-RKSJ-H を使うと文字化けは起きなくなるのではないかと思い、やってみると予想通り文字化けはなくなりました。

90ms-RKSJ-H とは何なのか検索してみると、90msが文字セット、RKSJが符号化方式、Hが組み方向を表していることが分かりました。
PDF Adviser エンコーディング

  • 90ms:WindowsでのMicrosoftの文字セット
  • RKSJ:Romaji Kana Shift JISの略。シフトJIS文字コード
  • H:Horizontalの略。拗促音や括弧などの記号類が、横書き用の文字であることを表す

83pv-RKSJのお話】「83pvは文字セットを表わし「83年度版JIS(JIS X 0208-1983)準拠の文字セットで、部分的に縦組用文字を含む(partially vertical)セット」という意味」だそうです。

0x5cを含む文字については「表\示」「\\」のように\を挿入することにします。

%!PS-Adobe-3.0 EPSF-3.0
% SJIS で保存。
% 参考:TeXが苦手とする処理
% http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?TeX%E3%81%8C%E8%8B%A6%E6%89%8B%E3%81%A8%E3%81%99%E3%82%8B%E5%87%A6%E7%90%86

/mm {2.834645669 mul} def

/verticalPosition   297 mm 20 mm sub def  % A4 297mm
/horizontalPosition 25 mm  def

/newline { /verticalPosition verticalPosition 20 sub def
           horizontalPosition verticalPosition moveto } def 

/putStrLn   { findfont 15 scalefont setfont show newline } def

horizontalPosition verticalPosition moveto
(---------------- 0x5c を含む文字------)  /MS-Mincho-90ms-RKSJ-H  putStrLn
% 実際に記入すると文字化けを起こしてしまいます。
(---------------- 機種依存文字------)     show newline
showpage


【参考】