プロが教えるわが家の防犯対策術!

以下は日本語文字列(EUC)の指定長(byte)切出し関数なのですが、
これをShift-JIS版にするにはどうすれば良いのでしょうか?
================================================================
sub jcut {
# 日本語文字列(EUC)の指定長(byte)切出し
local($string, $length) = @_;
if (substr($string,$length-1,1) =~ /[\x80-\xff]/) { $length++; }
return substr($string, 0, $length);
}
================================================================
宜しくお願い致します。

A 回答 (2件)

>substrはバイトでカットするため、半角、全角混じり文字列の全角の真中を切ってしまうことが有ります。



というか。。。微妙な問題なのに
Perlのバージョンとか種類を書かないのはなぜ??
Perl5.6とPerl5.8でも違うだろうし,
Perl4とかJperl4とか
Perl5.00*と対応するJperlとか.
ついでにいうと,localを使うのも意味不明だなあ.

推察するに相当古い環境ですか?
少なくとも,Perl5.8.8 on Winでは

use encoding "sjis";
print substr("aあいう",1, 2);

で「あい」って出てきますよ.
    • good
    • 0

require 'jcode.pl';



sub jcut {
# 日本語文字列(EUC)の指定長(byte)切出し
local($string, $length) = @_;
if (substr($string,$length-1,1) =~ /[\x80-\xff]/) { $length++; }
&jcode::convert(\$string, 'sjis');
return substr($string, 0, $length);
}

あるいは

use Jcode;

sub jcut {
# 日本語文字列(EUC)の指定長(byte)切出し
local($string, $length) = @_;
if (substr($string,$length-1,1) =~ /[\x80-\xff]/) { $length++; }
&Jcode::convert(\$string, 'sjis');
return substr($string, 0, $length);
}

これでいいと思います。

この回答への補足

substrはバイトでカットするため、半角、全角混じり文字列の全角の真中を切ってしまうことが有ります。
そのため、最後尾の文字が文字化け表示されます。
これを避けるためには、カット位置が半角か全角か調べて、全角の真中であればカット位置を調整してやる必要があります。
そういう関数なのですが、Shift-JISの場合は適用できません。

補足日時:2008/04/09 13:03
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!