[date:20121212]の検索結果
Perlのlength関数ではバイト単位となるので、UTF-8でエンコードされている場合、漢字、ひらがな、カタカナなどは1文字で3となってしまいます。
ブログなどのアプリケーションのテキスト処理ではそれでは不都合な場合もことも多いので、半角英数も全角文字(漢字、ひらがな、カタカナなど) も1文字としてカウントする関数を作成することにします。
UTF-8では、
1バイト目の先頭ビットが0の場合は1バイト文字
1バイト目の先頭から3ビットが110の場合は2バイト文字
1バイト目の先頭から4ビットが1110の場合は3バイト文字
1バイト目の先頭から5ビットが11110の場合は4バイト文字
1バイト目の先頭から6ビットが111110の場合は5バイト文字
1バイト目の先頭から7ビットが1111110の場合は2バイト文字
という仕様ですので、1バイト目のビットの状態を調べることによって、その文字が何バイトかを調べることができます。
以下のコードでは、この仕様にもとづいて全角文字を含む文字列の文字数を取得しています。
#!/usr/bin/perl
use strict;
use warnings;
my $testAscii = "ABCDEFG";
my $testHira = "あいうえお";
my $testKata = "アイウエ";
my $testKanji = "愛々木";
my $testAll = "ABCDEFGあいうえおアイウエオ愛夢佐々木";
print "length($testAscii) = ".length($testAscii), "\n";
print "strlen_utf8($testAscii) = ".strlen_utf8($testAscii), "\n";
print "length($testHira) = ".length($testHira), "\n";
print "strlen_utf8($testHira) = ".strlen_utf8($testHira), "\n";
print "length($testKata) = ".length($testKata), "\n";
print "strlen_utf8($testKata) = ".strlen_utf8($testKata), "\n";
print "length($testKanji) = ".length($testKanji), "\n";
print "strlen_utf8($testKanji) = ".strlen_utf8($testKanji), "\n";
print "length($testAll) = ".length($testAll), "\n";
print "strlen_utf8($testAll) = ".strlen_utf8($testAll), "\n";
exit;
# UTF-8でエンコードされた文字列の文字数を取得する。
sub strlen_utf8 {
my ($text) = @_;
my $textlen = length($text);
my $pos = 0;
my $count = 0;
while ($pos < $textlen) {
my $code = ord substr($text, $pos, 1); # 先頭のASCIIコード値を取得
my $bytelen = _bytesize($code);
$pos += $bytelen;
$count++; # 文字数をカウント
}
return $count;
}
# 文字のバイト長を求める
sub _bytesize {
my ($code) = @_;
my $size = 1;
if (0x80 & $code) { # 1バイト文字以外
$size++;
$code <<= 1;
for my $i (2 .. 8) {
last if (!(0x80 & $code));
$size++;
$code <<= 1;
}
}
return $size;
}
strlen_utf8関数では、substr関数を使用して1バイト目のASCIIコード値を取得し、 _bytesize関数を呼び出して文字のバイト数を求め、1文字分の処理を行うたびに文字数をカウントアップしています。
_bytesize関数ではパラメータで渡されたコード値の場合の文字のバイト数を、コード値のビットの状態から判定し 戻り値として返しています。
ゼロからわかる Perl言語超入門
技術評論社 著者:高橋 順子
amazon.co.jpのカスタマーレビューを見る
powered by amalink
1
アクセスランキング
今日のアクセスランキング TOP 10
- 警視庁の捜査資料がウィニーに流出 (2 PV)
- Mr.Children(ミスチル) (2 PV)
- ネット未来地図 ポスト・グーグル時代 20の論点 佐々木俊尚 (2 PV)
- 嬉野流開発者のたまごん(嬉野宏明)さんがソフト指し疑惑で将棋倶楽部24のアカウントを停止されてしまう #将棋 (2 PV)
- Microsoft OneNote(マイクロソフト ワンノート)- 文書作成ソフト (2 PV)
- Google Finance(グーグルファイナンス)- リアルタイム株価情報、金融ニュース、日本株 (2 PV)
- エーハチネット(A8.net)、商品DBサービスを開始 (1 PV)
- [映画]スター・ウォーズ/フォースの覚醒が大ヒット (1 PV)
- 「チケキャン」閉鎖、ミクシィ子会社運営のチケット転売サイト #チケットキャンプ (1 PV)
- 剛力彩芽さんが「顔がすごい好き」と前澤社長の魅力を告白、「お金目当て」は下衆の勘繰りだった (1 PV)
今月のアクセスランキング TOP 10
- Google Finance(グーグルファイナンス)- リアルタイム株価情報、金融ニュース、日本株 (10 PV)
- FC2WiFI (4 PV)
- 裁量トレードを半自動化する無料のMT5向け裁量トレード支援ツール(裁量補助EA)「PositionKeeper MT5」 #FX (3 PV)
- 三井住友海上火災保険、一部業務停止命令の見通し (3 PV)
- 2NN 2ちゃんねるニュース速報+ナビ (3 PV)
- Microsoft OneNote(マイクロソフト ワンノート)- 文書作成ソフト (3 PV)
- アドセンス代替広告にアフィリエイト広告を表示する方法 (3 PV)
- [配布終了]MT4向けスキャルEA「Surfing Forex(サーフィンフォレックス)」Free版(0.01ロット固定、無料、使用期限無し) #海外FX (2 PV)
- Windowsストア 日本語 (2 PV)
- ヤフーの検索結果に広告表示できるオーバーチュア「スポンサードサーチ」 (2 PV)
アクセス統計
ディレクトリ
関連サイト
