[スレッド全体]

[22] Re2:全角文字対応substr(S-JIS専用) 
2001/7/4 (Wed) 09:43:06 - あけび
改良版。

sub z_substr {
local($s,$p,$l,$o) = @_;
$s =~ s/(.)/$1\0/g;
$s =~ s/([\x81-\x9f\xe0-\xfc])\0(.)\0/$1$2\0\0/g;
$s = $l eq '' ? substr($s,$p*2):substr($s,$p*2,$l*2);
if ($o) { $s =~ s/^\0\0/ /; $s =~ s/.[^\0]$/ /;}
$s =~ tr/\0//d;
$s;
}

第4引数に1を与えた場合には、切り出した結果の文字列の
先頭が2バイト文字の2バイト目にあたる場合と
終端が2バイト文字の1バイト目にあたる場合には、
それぞれを半角スペースに置き換えて
返される文字長の辻褄合わせを行うようにしました。
第4引数を与えなかった場合はこれまでと同じです。

#example.
print &z_substr('全角文字',1,6,1);


[25] Re3:全角文字対応substr(S-JIS専用) 
2001/7/23 (Mon) 10:17:11 - あけび
更に機能追加。

sub z_substr {
local($s,$p,$l,$o) = @_;
$s =~ s/(.)/$1\0/g;
$s =~ s/([\x81-\x9f\xe0-\xfc])\0(.)\0/$o==2?"$1$2":"$1$2\0\0"/eg;
$s = $l eq '' ? substr($s,$p*2):substr($s,$p*2,$l*2);
if ($o==1) { $s =~ s/^\0\0/ /; $s =~ s/.[^\0]$/ /;}
$s =~ tr/\0//d;
$s;
}

第4引数を2とした場合には、
全角文字を1文字として数えるようにしました。

#example
print &z_substr("全角対応substr",2,7,2);

[▼次のスレッド]
INCM/CMT
Cyclamen v3.84.01