PDF MEMO

 PDFにはタイトルとか作成者、キーワードなどを含めることができますが、日本語を含めるにはどうすればいいのだろうと調べてみました。
 Acrobatでは問題なく編集できます。で、PDFファイル作成のバッチ処理のため使おうと思っているpdftkというツールでは、このキーワードなどのメタデータを別途ファイルにしておいて設定できます。以下のような感じです。

$ pdftk in.pdf update_info meta.txt output out.pdf

しかし、このファイルに直接日本語を入れてもだめでした。EUCUTF-8にしてもだめ。
 そこでpdftkではPDFファイルのメタデータを取得することもできることを思いだし、

$ pdftk in.pdf dump_data output meta.txt

みたいな感じで実行してみました。そして、この取得したテキストファイルを覗くと、日本語のデータは実体参照Unicodeの整数値となっています。ですから、pdftkなどでメタデータを変更するときもUnicodeの値を入れておけばOK。例えば「四畳半」は「四畳半」となります。
 このUnicodeの整数値というのはブラウザのJavaScriptでcharCodeAtメソッドで簡単に取得できますし、「実体参照 変換」で検索すれば変換できるページを見つけられます。(phpperlではどうするかは現在調査中)

追記

 perlでの変換方法は

use utf8;
$str = "四畳半";
@out = unpack("U*", $str);
foreach(@out) {
	print "&#$_;";
}

な感じです。対象とする文字列にどんなものが入ってもOKかどうかはわかりませんのでご注意。

追記 (3/20)

 phpではmb_encode_numericentityという関数がありました。

<?php
$str = "四畳半";
$convmap = array(0x0080, 0xffff, 0, 0xffff);
print mb_encode_numericentity($str, $convmap, "UTF-8"); 
?>

という感じです。$convmapという見慣れないものが出てきますが、コードの始点と終点の範囲、オフセット値、マスク値を指定します。UTF-8の場合0x00から0x7fの間はASCIIと同じですから、この場合は0x80からを変換する意味で上記のような始点指定となりました。
 ちなみに上記で「4畳半」を変換すると「4&#30067;&#21322;」に、$convmap = array(0x0000, 0xffff, 0, 0xffff);で変換すると「&#52;&#30067;&#21322;」となります。