M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2006年2月23日 00:01

PostScriptの8進数エンコーディングをデコードするワンライナー

このエントリーをはてなブックマークに追加 mixiチェック

昨日のエントリで使った 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進数エンコーディングをデコードするワンライナー

投稿 大野 義貴 [Script] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/1551

コメント(5)

>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進数エンコーディングをデコードするワンライナー

とします。

だから、単純にprintすれば、sjisの文字列が得られます。

あーマジで気付かなかった! でも pipe でぶっ込んだとき

echo "%ALDImageFileName: (Volume1:test:\225\275\220\25418\224N \221\262\213\306\217\330\217\221.eps)"| perl -pe 'print "$_";'
 

じゃうまくいかないみたい。

echoでの出力時点で、それは文字列と解釈されます。(当然でしょうが^^)
だから、perlが受け取文字列は、バックスラッシュがエスケープされた形(\\)で見える、、ということです。

perlから見て、「\+数字3桁」が一つの8進数と認識できる形で扱わなくてはいけません。

だから、perlが受け取文字列は、バックスラッシュがエスケープされた形(\\)で見える、、ということです。

意味分かったけど表現微妙? perl は入力から「\」を 0x5c の文字そのものとして受け取っていて、もし perl でその文字を取り扱うには、エスケープして「\\」となるってことですね。

はい^^ そういう意味です。

コメントする