• ベストアンサー

全角・半角が混じったテキストの100文字以上を"・・・"にしたい

perl5.8.5でCGIのプログラムを作っています。 全角・半角が混じったテキストの100文字以上を"・・・"にしたいと思っています。 プログラムの文字コードはEUCで書いています。 文字数の取得は、Jcodeを使って出しています。 $len = Jcode->new( $text )->jlength; これで100文字以上なら100文字以上の部分を削除して"・・・"を付け足すという感じにしたいと思っています。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

ひとまず、100文字に収める処理は以下のようでどうでしょうか。 もともとの文字列を $str に代入しておくとして、 $str =~ s/((?:[\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\xA1-\xFE]){100})(.*)/$1/; さらに、$2 を見て '・・・'を付け足せばいいかなと思いましたが、うまくいくかそれはやってみてません。

chachachar
質問者

お礼

ありがとうございます。 考え方は分かりました。 そのやり方で検証してみます。

その他の回答 (1)

回答No.2

Perl 5.6.x 以前に対する後方互換性を気にしないでよいのなら、 Perl 5.8.x から標準となった、Encode モジュールを使えばよい プログラムのほかの部分に影響を与えたくないのなら -------------------------------------------------------------------------------- #!/usr/local/bin/perl use strict; use warnings; use Encode qw(decode encode); my $text = '全角・半角が混じった100文字以上のテキスト'; $text = decode('euc-jp', $text); my $len = length($text); $text = substr($text, 0, 99) if $len >= 100; $text = encode('euc-jp', $text); $text .= '・・・' if $len >= 100; -------------------------------------------------------------------------------- Perl 5.8.1 以降、Jcode.pm はEncode.pm のラッパーとしてふるまうようになっており、 Jcode->jlengh は、内部での動作をみると、 ↑のように、UTFフラグを有効にして、文字単位でのlength を数えているだけです。 もしくは、 use encoding 'euc-jp'; としてソースコード中文字列のUTFフラグをたてれば、 次のように、1行で書ける。 ほか部分の入出力に気をつかう必要がありますが。。 -------------------------------------------------------------------------------- #!/usr/local/bin/perl use strict; use warnings; use Encode qw(decode encode); use encoding 'euc-jp'; my $text = '全角・半角が混じった100文字以上のテキスト'; # 100文字以上なら100文字以上の部分を削除して"・・・"を付け足す substr($text, 99) = '・・・' if length($text) >= 100; -------------------------------------------------------------------------------- Perl 5.8.x の日本語の取り扱いについては、下記Webページが詳しいです。 Perl 5.8.x Unicode関連 http://www.rwds.net/kuroita/program/Perl_unicode.html perl5.8のUnicodeサポート http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html Perl 5.8 以降においての Unicode 文字列の扱い方 - NDO::Weblog http://naoya.dyndns.org/~naoya/mt/archives/000611.html

chachachar
質問者

お礼

ありがとうございます。

関連するQ&A

専門家に質問してみよう