文字コードによるsubstrやlengthの動作の変化

perl の length を web で調べると、「バイト数」と載っていることが多いが、
社内のあるプログラムを修正しようとしていたとき、「文字数」になってしまう現象があった。

原因を調べると、use utf8; をしていると、utf8 フラグが立ち、文字数になるようす。

確かに、utf8 なのだから、バイト数で出されても困る場面が多いのは分かるのだが、
全角、半角で表示を調整しようとしているときには、正直困った。
何かいい方法はあるのだろうか。

というか、sprintf の フォーマットで %20s とか書いても、文字数で判断されたら、ぜんぜんフォーマットとして役に立たない・・・。

参考にしたサイト:
http://www.hikoboshi.org/perl/doc/encode.html




同じカテゴリー(PERL/CGI)の記事

この記事へのコメント
utf8はプラグマモジュールなので、そのプログラムが書かれたファイル全体に影響が出ます。

必要なスカラ変数にだけutf8フラグを立てたい場合、utf8::decodeとutf8::encodeを使うとよいです。

my $str = 'hogeほげほげ';
print length ($str) . "\n";
utf8::decode($str);
print length ($str) . "\n";
utf8::encode($str);
print length ($str) . "\n";

utf8::でcallするサブルーチンはuseしなくても使えます。
Posted by 名無し at 2007年11月29日 19:00
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

写真一覧をみる

削除
文字コードによるsubstrやlengthの動作の変化
    コメント(1)