[文字列]の検索結果


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)

PHPの場合は、ズバリ10進数を2進文字列に変換できるdecbin関数があるので、decbin関数を使用すればいいのですが、 もちろん、Perlの場合と同様にビット演算で2進文字列に変換することもできます。以下は、そのサンプルコードです。

<?php

// 'A'のアスキーコード値を取得
$asciicode = ord('A');

// PHPのdecbin関数で2進文字列に変換し、sprintfで整形
$binarystr = sprintf("%08.8s", decbin($asciicode));
print $binarystr . " (1)\n"; // for debug

// ビット演算で2進文字列に変換
$binarystr = _binstr($asciicode);
print $binarystr . " (2)\n"; // for debug

function _binstr($code) {
    $str = '';
    for ($i = 0; $i < 8; $i++) {
        $str .= (0x80 & $code) ? '1' : '0';
        $code <<= 1;
    }
    return $str; 
}
?>

このスクリプトをコマンドラインで実行すると次のように表示されます。

C:\xampp\htdocs\sample>\xampp\php\php binstr.php
01000001 (1)
01000001 (2)

PHPハンドブック (ハンドブックシリーズ)
ソフトバンククリエイティブ 著者:柏岡 秀男


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

[2242] Posted by kagahiro at 2012/12/11 19:33:29
0 point | Link (1) | Trackback (0) | Comment (0)

Perlの関数を使用して、以下の手順で10進数を2進文字列に変換することができます。sprintf関数で10進数を16進文字列に変換pack関数で16進文字列をバイナリーにパックunpack関数で2進文字列に変換例えば、文字列の先頭...
[2239] Posted by kagahiro at 2012/12/09 20:36:29
0 point | Link (4) | Trackback (0) | Comment (0)

単にテキストファイル等の文字エンコードを変換するのであれば、iconvコマンドを使用して変換すれば良いのですが、プログラム内部で取得した文字列の文字エンコードを変換したい場合もあります。以下のプログラムはL...
[1982] Posted by kagahiro at 2010/07/26 09:54:29
0 point | Link (2) | Trackback (0) | Comment (0)

HTML::Templateの<TMPL_VAR>タグは、プログラムでパラメータに値を設定すると、タグの部分がパラメータで設定された文字列で置き換えられるという簡単なものです。以下は、<TMPL_VAR>タグの使い方を示す...
[1974] Posted by kagahiro at 2010/07/22 13:20:16
0 point | Link (3) | Trackback (0) | Comment (0)

Webサイトの検索機能を利用してウイルスを送り込む攻撃が流行しているそうです。Webサイトの検索機能を悪用、「IFRAME SEOポイズニング」攻撃が流行大手のニュースサイトやショッピングサイトなどでは、サイト内の情...
[1308] Posted by kagahiro at 2009/04/27 04:03:26
0 point | Link (1) | Trackback (0) | Comment (0)

かんたんプログラミング Excel2003 VBA 基礎編Excel 2003のマクロ機能の解説とVBAの基本文法を詳解。かんたんプログラミング Excel2003 VBA コントロール・関数編15個のActiveXコントロール全てと、文字列操作関数、...
[768] Posted by kagahiro at 2006/07/21 01:16:57
0 point | Link (1) | Trackback (0) | Comment (0)

新プログラミング環境C#がわかる+使えるC#をどのように利用するべきかを、言語仕様のトピックごとに詳細に解説。C#によるプログラミングWindows 上Windowsフォーム(Windows.Forms)を有効活用するノウハウを詳解。上巻...
[744] Posted by kagahiro at 2006/07/13 04:00:29
0 point | Link (1) | Trackback (0) | Comment (0)

オブジェクト指向スクリプト言語Rubyに関する書籍。Rubyの入門書、リファレンス、Ruby on Railsを使ったWebアプリケーションの開発手法など。たのしいRuby 第2版 Rubyではじめる気軽なプログラミングRubyを基礎から学...
[741] Posted by kagahiro at 2006/07/12 06:55:08
0 point | Link (5) | Trackback (0) | Comment (0)

|< 先頭へ  < 前へ  1 2 3  次へ >


アクセスランキング

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

  1. 安全性重視の完全無料ナンピンマーチンEA「Million Dollar(ミリオンダラー)」 #FX #ゴールド #ビットコイン (6 PV)
  2. 無料のMT4向けナンピンマーチン爆益(爆損)EA「Jipangu(ジパング)」 (5 PV)
  3. 2NN 2ちゃんねるニュース速報+ナビ (5 PV)
  4. 自作のMT4向け無料EA(口座縛り無し、ブローカー縛り無し、使用期限無し)とゴゴジャン出品中の有料EAの一覧 #MT4 (3 PV)
  5. 裁量トレードを自動化する裁量補助EA「AutoScalper Demo」 (3 PV)
  6. Exness ソーシャルトレーディングの戦略プロバイダーになりました (2 PV)
  7. Million Dollar Ver 1.09向けの収益性を重視したゴールド(Gold、XAUUSD)ロングセットファイル (2 PV)
  8. Million Dollar Ver 1.09向けの収益性を重視したドル円(USDJPY)ロングセットファイル (2 PV)
  9. 完全無料のMT5用ナンピンEA「Nanpin K(ナンピンケイ) MT5」 使用制限無し (2 PV)
  10. SQLのSELECT文で先頭から上位(TOP)10件のレコードを取得する方法(SQL Server、Oracle、MySQL、PostgreSQL) (2 PV)

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

  1. 2NN 2ちゃんねるニュース速報+ナビ (3281 PV)
  2. SQLのSELECT文で先頭から上位(TOP)10件のレコードを取得する方法(SQL Server、Oracle、MySQL、PostgreSQL) (525 PV)
  3. 安全性重視の完全無料ナンピンマーチンEA「Million Dollar(ミリオンダラー)」 #FX #ゴールド #ビットコイン (101 PV)
  4. 自作のMT4向け無料EA(口座縛り無し、ブローカー縛り無し、使用期限無し)とゴゴジャン出品中の有料EAの一覧 #MT4 (93 PV)
  5. SQLiteのSELECT文で上位 (TOP) n件のデータを取得する (76 PV)
  6. 無料のMT4向けナンピンマーチン爆益(爆損)EA「Jipangu(ジパング)」 (68 PV)
  7. Million Dollar Ver 1.09向けの収益性を重視したゴールド(Gold、XAUUSD)ロングセットファイル (68 PV)
  8. 仲値トレードが簡単にできる無料EA「NAKANE3 Ver 2.04」 #MT4 (60 PV)
  9. [FX]裁量ポジションを簡単に管理できるMT4向け無料の裁量補助EA「PositionKeeper」 (54 PV)
  10. 2chまとめサイト - 痛いニュース(ノ∀`) (48 PV)

アクセス統計

ディレクトリ

関連サイト