PostScriptの8進数エンコーディングをデコードするワンライナー
スポンサードリンク
昨日のエントリで使った PostScript エンコーディングをデコードするワンライナーについて説明します。
ワンライナー
Unix や Mac OS X では、こんな感じで実行してください。
$ more hoge.ps | perl -pe 's/\\([0-7]{3})/pack("C",oct($1))/ego;'
Windows+ActivePerl ではこんな感じで実行してください。シェルの関係で、ダブルクォーテーションとアポストロフィを入れ替えました。
>more hoge.ps | perl -pe "s/\\([0-7]{3})/pack('C',oct($1))/ego;"
使用例
昨日のエントリで出した、OPI コメントを解読してみます。
Windows+ActivePerl:
echo "%ALDImageFileName: (Volume1:test:\225\275\220\25418\224N \221\262\213\306\217\330\217\221.eps)"| perl -pe "s/\\([0-7]{3})/pack('C',oct($1))/ego;"
Mac OS X:(iconv で出力をコンソールのエンコーディングに合わせよう!)
echo "%ALDImageFileName: (Volume1:test:\225\275\220\25418\224N \221\262\213\306\217\330\217\221.eps)"| perl -pe 's/\\([0-7]{3})/pack("C",oct($1))/ego;' | iconv -f SJIS -t utf-8
~~~
これで、PostScript の中身を読むのも恐くないと思います。
検索しやすいように、単独エントリとして書いておきました。
(2006-02-24 8.30訂正)
title要素
修正前)PostScriptエンコーディングをデコードするワンライナー
修正後)PostScriptの8進数エンコーディングをデコードするワンライナー
スポンサードリンク
トラックバック(0)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/1551
>PostScript エンコーディング
そんな表現しましたっけ^^
例の文字列は、単に文字コードの8進表現なだけで、Perlなんかでも同じ表現しますね。
で、そのまま標準出力に渡すと、sjisの文字になったりします^^(って、当然か)
だから、単純にprintすれば、sjisの文字列が得られます。
----
perl -e "print(\"%ALDImageFileName: (Volume1:test:\225\275\220\25418\224N \221\262\213\306\217\330\217\221.eps)\")";
----
必要に応じて、最後にリダイレクト(> filename)すれば、ファイルに落ちますし。
このエントリ書いたのがそもそもその言葉で検索しても出てこなかったからなのですがそういう表現しないなら出てこなくてもしょうがないですね。ていうわけで、ぐぐるにフェッチられる前に
修正前)PostScriptエンコーディングをデコードするワンライナー
修正後)PostScriptの8進数エンコーディングをデコードするワンライナー
とします。
あーマジで気付かなかった! でも pipe でぶっ込んだとき
じゃうまくいかないみたい。
echoでの出力時点で、それは文字列と解釈されます。(当然でしょうが^^)
だから、perlが受け取文字列は、バックスラッシュがエスケープされた形(\\)で見える、、ということです。
perlから見て、「\+数字3桁」が一つの8進数と認識できる形で扱わなくてはいけません。
意味分かったけど表現微妙? perl は入力から「\」を 0x5c の文字そのものとして受け取っていて、もし perl でその文字を取り扱うには、エスケープして「\\」となるってことですね。
はい^^ そういう意味です。