EUC-JP交じりの文書の分割が成功したかどうか
日本語の文章を、途中で分割したいことがあると思います。
jperlを使っていればこれはうまく行きますが、日本の文字
1文字はEUC-JPでは2バイトから3バイトで構成されているの
で、普通のPerlの場合運悪く文字のど真ん中で分割してしま
うと場合文字化けを起こしてしまいます。
そこで、分割後、分割がうまくいったかどうかを調べる
ルーチンを考えてみました。以下です。
もし、EUC-JPのG3(なぜかこいつだけ3バイト)が全く使わ
れていないと仮定できれば(実際あまり使われてないと思
う)、MSB(最上位ビット)が立ってるバイト数が奇数かどう
か調べるだけで分割に失敗したかどうかがわかるはずです。
if(tr/[\x8E\xA1-\xFE]/[\x8E\xA1-\xFE]/ % 2){
# 分割に失敗
}
G3は3バイトなので、1バイト目の\x8Fを数えないようにす
れば、G3の2バイト目と3バイト目が分断されても同じ方法
でうまく行くはずです。
あとは、G3の1バイト目と2バイト目で分断された場合だけ
ですが、これは\x8Fが文字列末にあるかどうかで判断でき
ます。
というわけで、
$_ = 調べたい文字列;
if (/\x8F$/ || tr/[\x8E\xA1-\xFE]/[\x8E\xA1-\xFE]/ % 2){
# 分割に失敗
}
とすれば、分割に失敗したかどうか判断できます。
例えば$textにEUC-JPの文字列が入っていて、これの
255バイト以降(Pascalか?(笑))を切り落としたいなら
for($text){ # このfor文は単に$_ = $textと同じ。
$text = substr($text, 0, 255);
chop($text) if (/\x8F$/ || tr/[\x8E\xA1-\xFE]/[\x8E\xA1-\xFE]/ % 2);
chop($text) if (/\x8F$/);
}
とすればよいでしょう。
うまく応用すればfold(1)も作れることでしょう。