日本語(EUC-JP)の substr の続き

正直なところ、僕はあんまり日本語処理に詳しいわけではないので話を続けるのもどうかと思ったけど、もうちょっと書いてみます。

この前のエントリ 日本語(EUC-JP)の substr でなんで Encode.pm を使わないで実装したかったかというと、

my $new_str = encode( 'euc-jp', decode( 'euc-jp', $str ) );

すると機種依存文字((株) 0xADEA とか)が元に戻らない場合があったりするらしいからです。そもそも機種依存文字エンコード/デコードなんて Encode.pm の対応範囲外のことなんだろうけど、現実問題として困ったりすることがある *らしい* のですよ(らしいばかりですみません)。

ところで、これは全く知らなかったのですが、

use encoding 'euc-jp';

は凄いですね。これの後の substr は超速かつなんの問題もありませんでした。ただ use encoding はスコープがないので使いどころが難しそう。

まとめというか、標準入出力が EUC-JP 以外ありえないなら use encoding 'euc-jp'; が一番正解な気がします。速いし。encode('euc-jp', substr(decode('euc-jp', $str), $offset, $length)); も速度的には問題はないし、まあ機種依存のことなど気にしないってことで。本当にエラーになるかどうか良くわからないし :-)。Perl5.6 とかだったら my(@chars) = ( $str =~ /($ascii|$two_bytes|$three_bytes)/og ); 使ってもいいかなー。って感じですかね。

それと euc_substr の length の件はひどいミスでした。というかほとんどテストしてなかった ;-)

ああ恥ずかしい。日本語処理は難しいなあ。