2008年10月アーカイブ

前のブログの続き。

lengthを使ったperlコードだと、調整が必要。

たとえば、Mac OS Xのperlで


use utf8;
print length ('あいうえお');
print "\n";

は「5」とUnicodeでの字数を表すが、

print length ('あいうえお');
print "\n";

のようにuse utf8;がないと「15」と、ASCIIの字数、すなわちバイト数を表す。

これはじゃあMacJPerlではどうだったかというと、


print length ('あいうえお');
print "\n";

が「10」を表示する。
ShiftJISでのバイト数。


文字のコードの問題をいえば、Unicodeで005cである「\」(バックスラッシュ)はShift-JISには変換できない。
Shift-JISの5cに変換できるのは、Unicodeで00a5の「¥」。

perlを使うのに、MacJPerl 5のドロップレットは便利だった。
過去形なのは、Mac OS Xでは使えないから。
だから、perlを使うたびに、せっかくMac OS Xにはperlが標準装備されているのにClassicのMacPerl5を使うという、変なことになっていた。

で、思い切ってひとつ、Mac OS Xに移植してみることにした。
MacJPerl 5のドロップレットは、一太郎の吐き出したshift-JISのテキストを加工して、違うファイル名のshift-JISテキストに書き換えるというもの。
オリジナルの一太郎ファイルには、いわゆる機種依存文字があって、それを機種依存でない、shift-JISで使える文字に書き換えている。
そんな機種依存文字はそもそもマックでは読めないだろうから、その部分は妥協して、一太郎ではき出すときにUnicodeテキストで吐き出させることに変更した。

まず、ドロップレットをMacJPerlで開いて、エディターにコピー&ペースト。
不思議だが、JeditXにペーストしたら思い切り文字化けしたので、Jedit4にペースト。
この状態で、このperlファイルにも、Windowsな機種依存文字が含まれているから、その部分は文字化けしている。
もちろん、その部分は、MacJPerlでも文字化けしていたが、特に問題はなかった。なんだかんだ言って、昔は単純だったんである。
その機種依存文字が含まれているものを、Jedit4できちんとUTF8に変換できるとは思えなかったので、いったん保存。
このファイルをWindowsに持っていって、一太郎で開く。
それを今度はUnicodeテキストとして保存。
もういちどマックに持ってきて、JeditXで開く。
ここで文字コードを調べたらUTF-16だった(一太郎のUnicodeテキストはUTF-16らしい)ので、UTF-8にして、改行コードもLFにして、保存し直す。
拡張子は「.pl。」
以上でまずは、ファイルのコード変換終了。

新しくできたファイルを今度は、Mac OS Xのperlで読めるようにする。

頭に

#!/usr/bin/perl use utf8; use Encode;

の3行を追加。
いったんファイルを閉じて、ターミナルを起動。
ターミナルで

chmod 755

とタイプしてから、さっき保存した新しいperlファイルをドロップして、returnをタイプする。
このターミナルの作業と、さっき加えた「#!/usr/bin/perl」のおかげで、ターミナルからこのperlファイルが起動できるようになる。
(この作業がないと、いちいちperlと打たなければならなくなる)

ちなみに、さっき加えた2行目はperlの内部コードにUTF-8を使えるようにするもの、3行目はshift-JISが使えるようにするためのもの。
この2行で、JPerlのような仕事ができるようになる。

openの行を書き換える。
入力のほうは

open (ORIG, '<:encoding(utf16)', "$file");

出力の方は

open OUT, '>:encoding(shiftjis)', $newfile;

(かっこはあってもなくても同じはずである。)

次に、改行コードの違いに対応する。
一太郎の吐き出したファイルは、CR+LF。
これをCRなMacJPerlで使えるようにするためには、LFをカットしていた。

s/\x0a//g;

ところが、Mac OS XのperlはLFなUnixだから、CRをカットするように書き換える。

s/\x0d//g;

これで、動く。

ところが、動かしてみると、いくつかのコードをshift-JISに変換できないというメッセージが出る。
「〜」と「-」の2文字。(他にも実はあるのかも知れないけれど、今回引っかかったのはこれだけ)
この2文字は、一太郎からshift-JISに出力すると変換して出力するのに、Unicodeに出力すると、shift-JISに変換できない方の文字コードを吐いてくるらしい。
仕方がないので、

tr/〜-/〜ー/;

の1行を追加。
....左と右とは、Unicodeでは文字コードが違う。
これで完成。

使い方

ターミナルを起動。
作ったperlファイルをターミナルにドロップ。
一太郎から吐き出した(変換したい)ファイルをターミナルにドロップ。
return。

このアーカイブについて

このページには、2008年10月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2008年6月です。

次のアーカイブは2008年12月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。