[5]の検索結果


Perlのsubstr関数ではバイト単位の操作になるので、漢字、ひらがな、カタカナなどの全角文字を文字数で指定して部分文字列を取り出すことができません。それでは不都合なことも多いので、半角英数も全角文字も1文字として部分文字列を取り出すことができる関数を作成します。

以下はそのコードです。[Perl]UTF-8でエンコードされた文字列の文字数を取得するコードと同様に、文字の1バイト目のビットの状態を調べることによってその文字が何バイト文字を判定しています。

#!/usr/bin/perl

use strict;
use warnings;

my $testStr = "ABCDEFGあいうえおアイウエオ愛夢佐々木";

print "substr_utf8($testStr, 0, 5) = " . substr_utf8($testStr, 0, 5), "\n";
print "substr_utf8($testStr, 3, 3) = " . substr_utf8($testStr, 3, 3), "\n";
print "substr_utf8($testStr, 10, 4) = " . substr_utf8($testStr, 10, 4), "\n";
print "substr_utf8($testStr, 13, 5) = " . substr_utf8($testStr, 13, 5), "\n";
print "substr_utf8($testStr, 13) = " . substr_utf8($testStr, 13), "\n";

exit;

# UTF-8でエンコードされた文字列の部分文字列を取り出す
# substr_utf8 (文字列式, オフセット[, 長さ])長さを指定しなかった場合は最後まで
sub substr_utf8 {
    my ($src, $offset, $len) = @_;

    my $srclen = length($src);
    my $pos = 0;
    my $count = 0;
    my $dest = '';

    while ($pos < $srclen) {
        my $code = ord substr($src, $pos, 1); # 先頭のASCIIコード値を取得
        my $bytelen = _bytesize($code);
        if (defined($len)){
            if ($count >= $offset && $count < ($offset + $len)) {
                $dest .= substr($src, $pos, $bytelen);
            }
        } else { # 長さ指定なし
            if ($count >= $offset) {
                $dest .= substr($src, $pos, $bytelen);
            }
        }
        $pos += $bytelen;
        $count++; # 文字数をカウント
    }

    return $dest;
}

# 文字のバイト長を求める
sub _bytesize {
    my $code = shift;
    my $size = 1;
    if (0x80 & $code) { # 1バイト文字以外
        $code <<= 1;
        for my $i (2 .. 8) {
            $size++;
            $code <<= 1;
            last if (!(0x80 & $code));
        }
    }
    return $size;
}

substr_utf8関数では、substr関数を使用して1バイト目のASCIIコード値を取得し、 _bytesize関数を呼び出して文字のバイト数を求め、その文字がパラメータで指定された範囲の場合は、戻り値として返す文字列に連結し、そうでなかった場合は文字数のカウントアップのみ行なっています。

_bytesize関数ではパラメータで渡されたコード値の場合の文字のバイト数を、コード値のビットの状態から判定し戻り値として返しています。

もっと自在にサーバを使い倒す 業務に役立つPerl (Software Design plus)
技術評論社 著者:木本 裕紀


amazon.co.jpのカスタマーレビューを見る
powered by amalink

[2244] Posted by kagahiro at 2012/12/13 10:51:25
0 point | Link (4) | Trackback (0) | Comment (0)

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

[2243] Posted by kagahiro at 2012/12/12 11:56:21
1 point | Link (3) | Trackback (0) | Comment (1)

PC向けのOS(オペレーティングシステム)としては圧倒的なシェアを持つマイクロソフトのOS「Windows」の最新版「Windows 8(ウィンドウズ エイト)」の日本語版の販売が開始された。Windows 8(ウィンドウズ エイト)は、Windows 7の後継として開発されたパソコン及びタブレット端末用OS。

日本マイクロソフトの専用サイトでは、Windows XP/Vista/7のユーザーを対象としたWindows 8 Proへのアップグレード版が3,300円でダウンロード販売(パッケージ版の Windows 8 Proは5,800円程度)されており、アプリケーションやハードウエアの互換性をチェックし、対応状況を確認した上で購入が可能になっている。

なお、3,300円という価格は、2013年1月31日までの期間限定のキャンペーン価格なので、キャンペーン期間の終了後は大幅な値上げが予想される。

Windows を購入する - Microsoft Windows
[Windows 8発売]3300円のダウンロード販売も開始
Microsoft Windows 8
Windows 8 Release Preview
Microsoft Windows 8発売日 Windows 8 10月26日発売決定 情報まとめ

Microsoft Windows 8 Pro (DSP版) 64bit 日本語
マイクロソフト(DSP)


amazon.co.jpのカスタマーレビューを見る
powered by amalink


Microsoft Windows 8 (DSP版) 64bit 日本語
マイクロソフト(DSP)


amazon.co.jpのカスタマーレビューを見る
powered by amalink


[2233] Posted by kagahiro at 2012/10/26 12:17:19
1 point | Link (3) | Trackback (1) | Comment (0)

Amazon.co.jpが電子書籍ストア「Kindleストア」をオープンし、日本語電子書籍の販売を開始した。既にiOS(iPhone、iPad)、Android向けの無料アプリが公開されており、購入した電子書籍はiOS(iPhone、iPad)、Andro...
[2232] Posted by kagahiro at 2012/10/25 17:28:48
0 point | Link (6) | Trackback (0) | Comment (0)

iPhone 5(アイフォーンファイブ)は、米アップルコンピュータ社が製造販売しているカメラ付きのスマートフォン「iPhone」の最新モデル。アルミニウムのボディに4インチのRetinaディスプレイが搭載され、A6チップによ...
[2230] Posted by kagahiro at 2012/10/19 10:31:01
0 point | Link (3) | Trackback (0) | Comment (0)

GoogleがAndroid 4.1を搭載した7インチ液晶タブレット端末「Nexus 7」の販売を開始、オンラインストアのGoogle Playで購入できる。日本で購入できるのは16GBモデルのみとなっており価格は1万9800円から。仕様は、7イ...
[2226] Posted by kagahiro at 2012/09/27 12:14:51
0 point | Link (3) | Trackback (0) | Comment (0)

仕様変更が行われたのは去年(2011年)の10月26日なのですが、これまではAmazonの審査を受けて仕様変更が解除されれば旧バージョンの仕様で利用できていたようです。しかし、2012年9月1日からは旧バージョンのAPI自体...
[2222] Posted by kagahiro at 2012/08/31 10:29:52
0 point | Link (1) | Trackback (0) | Comment (0)

夏にベータテスト開始で、秋には正式リリースか。もうカレンダー上は夏だからもうすぐベータ版が出るのかな。シックス・アパートは今秋、Movable Type 5 の次期バージョンにあたるMT 5.2 を出荷する予定です。Movabl...
[2209] Posted by kagahiro at 2012/06/06 16:21:00
0 point | Link (2) | Trackback (0) | Comment (0)

なるほど、これは非常に参考になりますね。ということで、海外の掲示板でよく見かける、特徴的なネットスラングを色々調べてみたので簡単にまとめ。例文はすべてmyanimelistという海外のアニメファンが集まる掲示板の...
[2201] Posted by kagahiro at 2012/05/30 17:49:40
0 point | Link (0) | Trackback (0) | Comment (0)

2012年5月25日にデビュー25周年を迎えた女性歌手「森高千里」さんの公式チャンネル。過去のプロモーションビデオ、ライブ映像のほか、「200 曲セルフ・カヴァー企画」として、デビューした1987年から1999年までにリリ...
[2198] Posted by kagahiro at 2012/05/26 10:40:55
1 point | Link (1) | Trackback (0) | Comment (1)

|< 先頭へ  < 前へ  20 21 22 23 24  次へ >


アクセスランキング

今日のアクセスランキング TOP 10

  1. SQLのSELECT文で先頭から上位(TOP)10件のレコードを取得する方法(SQL Server、Oracle、MySQL、PostgreSQL) (7 PV)
  2. 2NN 2ちゃんねるニュース速報+ナビ (3 PV)
  3. 衆議院インターネット審議中継 (2 PV)
  4. ニフティ、ブログにアプリを貼り付けることができるサービスを開始 (2 PV)
  5. 経済指標(けいざいしひょう) #乱高下 #死標 (2 PV)
  6. PINMA FREEの配布は終了しました (2 PV)
  7. Webメールのアドレス帳から勝手に招待状をばら撒くSNS「Tagged」 (1 PV)
  8. Python(パイソン) (1 PV)
  9. トラックワード(track word) (1 PV)
  10. OpenLDAP 書籍 (1 PV)

今月のアクセスランキング TOP 10

  1. SQLのSELECT文で先頭から上位(TOP)10件のレコードを取得する方法(SQL Server、Oracle、MySQL、PostgreSQL) (30 PV)
  2. FC2まとめ (15 PV)
  3. 2NN 2ちゃんねるニュース速報+ナビ (10 PV)
  4. StartPage(スタートページ) - 匿名検索エンジン (8 PV)
  5. 将棋ウォーズPCブラウザ版がchrome、Firefox、edgeなどに対応 (8 PV)
  6. 安全性重視の完全無料ナンピンマーチンEA「Million Dollar(ミリオンダラー)」 #FX #ゴールド #ビットコイン (5 PV)
  7. 掲示板CGI ThreadPlus 1.2 のリリース (5 PV)
  8. 「Kindle for the Web」 (5 PV)
  9. [FX]裁量ポジションを簡単に管理できるMT4向け無料の裁量補助EA「PositionKeeper」 (5 PV)
  10. 2ちゃんねる(2ch) (5 PV)

アクセス統計

ディレクトリ

関連サイト