• 締切済み

日本語文字列の指定長(byte)切出し

以下は日本語文字列(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); } ================================================================ 宜しくお願い致します。

みんなの回答

  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.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); で「あい」って出てきますよ.

すると、全ての回答が全文表示されます。
回答No.1

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); } これでいいと思います。

das_horn
質問者

補足

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

すると、全ての回答が全文表示されます。

関連するQ&A