電子書籍の厳選無料作品が豊富!

データの文字数を一定の数字で省こうと思い下記の内容を参考にしようと思っているのですが
下記はUTF-8用なので、SJISに対応させるにはバイト列の定義を変更すれば良いのですが
どのように変更すれば良いのは分かりません。



my #str = "あいうえおかきくけこさしすせそ"; # 元の文字列
my $view = 10; # 10文字まで表示し後は省略

print &main::round_utf8($str,$view);

sub round_utf8 {
my ($str,$view) = @_;

my $one = "[\x00-\x7F]"; # 1バイト文字
my $two = "[\xC2-\xDF][\x80-\xBF]"; # 2バイト文字
my $three = "[\xE0-\xEF][\x80-\xBF]{2}"; # 3バイト文字
my $bigger = "[\xF0-\xF7][\x80-\xBF]{3,}"; # 4バイト以上

$str =~ s/^(($one|$two|$three|$bigger){$view}).+/$1.../g;

return $str;
}

私が考えているのは$****に入っている文字列を10文字以降は..で省略させることです。

アドバイスのほどをどうか宜しくお願いします。

A 回答 (2件)

そもそもやりたいことは「一定の文字数で切る」ことなんでしょう? だとしたら, 「文字」の世界で考えるべきであって, 「バイト列」なんてものを持ち出すのは混乱の本でしかありません.



で今の Perl で一番簡単なのは #1 にあるように
Encode::decode→s///→Encode::encode
とやること. これなら「バイト列」なんて厄介なものを持ち出すことなく「文字」の世界だけで完結します. ちなみに今の Perl なら s/// は
$str =~ s/^.{$view}\K.+/.../;
の方が効率よさそう.

余談ですが, 当然 g は不要ですね>#1.
    • good
    • 0
この回答へのお礼

勉強になりました。
有り難うございます!

お礼日時:2011/12/31 02:02

Shift_JISの文字コード表とかを見れば、1バイト文字、2バイト文字の範囲がわかると思います。


http://charset.7jp.net/sjis.html

あと、最近のならdecode→s/^(.{$view}).+/$1/;→encodeがいいかも。

ところで、
> $str =~ s/^(($one|$two|$three|$bigger){$view}).+/$1.../g;
ここでgいりますか?
    • good
    • 0
この回答へのお礼

勉強になりました。
記入されたサイトを元に勉強します。
ありがとうございました!

お礼日時:2011/12/31 02:03

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