convbkmk.rb で しおりつきの PDF ファイルを作成すると文字化けします.
PDF の仕様では,しおりなどの文字列は UTF-16BE の16進数表記で BOM を付加するということだと思うのですが,ソースを見ると
buf = 'FFFE' # BOM for UTF-16BE
となっています.この付け方だと FF (255) FE (254) となり UTF-16LE となると思うので正しくは
buf = 'FEFF' # BOM for UTF-16BE
だと思います.'FEFF' に修正して PDF ファイルを作成したところしおりが文字化けせずに表示されました.
2011/04/30 の W32TeX で PDF ファイルを作成して,しおりが文字化けせずに表示されることを確認しました.
対応ありがとうございました.
あと,ついでに気づいたことを書いておきます.
文字列が ASCII の場合,convbkmk は変換せず,bkmk2uni は変換するようです.
前にこれと同じようなプログラムを書いたことがあるのですが,そのときにチェックボックスが文字化けをおこしてしまったので調べてみると check boxes や radio buttons は PDFDocEncoding (8bit) の制限があり,Unicode character encoding (16bit) では扱えなかったので PDF 1.4 から check boxes や radio buttons の field dictionary に,オプションで Opt というキーが追加されたみたいです.
これは文字列配列型を値にとります.→ /Opt [()()...]
/DOCINFO (文書のプロパティ) や /OUT (しおり) などの pdfmark であればおそらく問題はないと思いますが,文字列が ASCII のみであれば変換しない方が無難かもしれません.
あと bkmk2uni は C でかかれており,間違ったエンコーディングを指定してもエラーチェックをしていないのでクラッシュすることがあるかもしれません.(前に間違って -e オプションを指定したときにクラッシュしました.)
以上です.
対応ありがとうございました.
あと,ついでに気づいたことを書いておきます.
文字列が ASCII の場合,convbkmk は変換せず,bkmk2uni は変換するようです.
前にこれと同じようなプログラムを書いたことがあるのですが,そのときにチェックボックスが文字化けをおこしてしまったので調べてみると check boxes や radio buttons は PDFDocEncoding (8bit) の制限があり,Unicode character encoding (16bit) では扱えなかったので PDF 1.4 から check boxes や radio buttons の field dictionary に,オプションで Opt というキーが追加されたみたいです.
これは文字列配列型を値にとります.→ /Opt [()()...]
/DOCINFO (文書のプロパティ) や /OUT (しおり) などの pdfmark であればおそらく問題はないと思いますが,文字列が ASCII のみであれば変換しない方が無難かもしれません.
あと bkmk2uni は C でかかれており,間違ったエンコーディングを指定してもエラーチェックをしていないのでクラッシュすることがあるかもしれません.(前に間違って -e オプションを指定したときにクラッシュしました.)
以上です.
ご指摘ありがとうございます。
久々に upTeX のページ を更新し、convbkmk.rb の更新版を置きました。
テストはしていたのですが、VineLinux の中の ps2pdf では問題なく作成できていたので気付きませんでした。
pdfmark の仕様では Unicode の場合 FEFF で始まる必要があるとのことです。この ps2pdf が pdfmark の仕様外の動作をする (UTF-16LE のBOMを UTF-16BE と読み替える寛容(?)な動作をしている) という風に理解しました。
久々に upTeX のページ を更新し、convbkmk.rb の更新版を置きました。
テストはしていたのですが、VineLinux の中の ps2pdf では問題なく作成できていたので気付きませんでした。
pdfmark の仕様では Unicode の場合 FEFF で始まる必要があるとのことです。この ps2pdf が pdfmark の仕様外の動作をする (UTF-16LE のBOMを UTF-16BE と読み替える寛容(?)な動作をしている) という風に理解しました。