読者です 読者をやめる 読者になる 読者になる

初代Masteries

きっとモヒカンにもなれないお前たちに告げる!!!

Acme::SuddenlyDeathをリリースしました.

2013年1月1日, Acme::SuddenlyDeathというモジュールで遂にCPAN Authorデビューさせて頂きました.

モジュールの概要

最近若干流行り気味の「突然の死」風のAAを生成するモジュールです.

_人人人人人_
> 突然の死 <
 ̄^Y^Y^Y^Y^ ̄

こんな感じのAAを簡単に生成することができます.

lengthとbytes::length, Text::VisualWidth

Acme::SuddenlyDeathをuseすると, 自動的にsuddenly_deathとsuddenly_death_singleが使えるようになります*1.

実装としては, 関数の引数として与えた文字列に対して, 半角文字は幅1, 全角文字は幅2として文字列の幅を求めて, それに従って文字列をAAで囲っている感じです.

当初はlengthで幅を求めれば... と軽く考えていたのですが,

use utf8;

print length ("aiueo") . "\n";  # => 6
print length ("あいう") . "\n"; # => 3

言うまでもなく, lengthでは全角文字1つを1として数えてしまう為, うまくいきませんでした.


という意見を頂いたのですが,

use utf8;
use bytes;

print bytes::length ("aiueo") . "\n";  # => 5
print bytes::length ("あいう") . "\n"; # => 9

bytesもダメ...


最終的には@さんが教えて下さったText::VisualWidthを使うことで解決することができました.

use utf8;
use Text::VisualWidth::UTF8;

print Text::VisualWidth::UTF8::width("aiueo") . "\n";  # => 5
print Text::VisualWidth::UTF8::width("あいう") . "\n"; # => 6

@さん, @さん, どうもありがとうございました!

結論

文字列の幅を求めるときは, 素直にText::VisualWidthを使おう!

ちなみにText::VisualWidthには, UTF8用のText::VisualWidth::UTF8の他にEUC_JP用のText::VisualWidth::EUC_JPもあるので, 必要に応じて使い分けるといいでしょう.

*1:2つの関数の違いは, AAを3行で表示するか, 改行なしで1行で表示するかです.