高速半角全角ライブラリ

Perlで半角・全角・絵文字処理を行うのに欠かせない Jcode モジュールですが、如何せん処理が遅い。Perl 5.8.xでは Encode モジュールがあるのですが Jcode と扱いが結構違うので (+д+)マズー
Jcode 1.9 系/2.x系も内部実装が Encode モジュールに変更されたので、Jcoce 0.x 系と動作が違って (+д+)マズー

そこで XS を使った半角・全角・imode絵文字処理を高速処理するモジュールを公開します。Jcode の処理に比べて 10 倍程度の高速化が期待できますが、XS モジュールなのでコンパイルできる環境が必要となります。
※コンパイル済みのモジュールは gcc のバージョンの差異で動作しない可能性があるので配布を停止しました。

スクリプトはこちら(DrkEncode.tar.gz) 

- スポンサーリンク -

動作環境

gcc 等の C コンパイラが使用可能な Linux 環境。Windows でコンパイルするには Makefile の修正がいるかも...

install 方法(いつもの make install です)

  1. DrkEncode.tar.gz をサーバ内の適当なところへ FTP して下さい。
  2. tar xvfz DrkEncode.tar.gz
    cd Drk-Encode-1.0x

    perl Makefile.PL

    make install
  3. Jcodeとのベンチマークをとりたい方は、 t/bench.pl を実行下さい。

NAME

Drk::Encode - 高速半角全角ライブラリ

SYNOPSIS

use strict;
use Drk::Encode;
my $m = Drk::Encode->new({ASCII=>1, KANA=>0});

my $zenkaku = 'ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾ
ダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマ
ムメモャヤュユョヨラリルレロヮワヰヱヲンヴ「、。・゛゜ー」 
!”#$%&’()*+,ー./0123456789:;<=>?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ[¥]^_`
abcdefghijklmnopqrstuvwxyz{|}〜
';
print $m->z2h($zenkaku,'euc');

my $hankaku = 'ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾ
ダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマ
ムメモャヤュユョヨラリルレロヮワヰヱヲンヴ「、。・゙゚ー」
!"#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO
PQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
';
print $m->h2z($zenkaku,'euc');

DESCRIPTION

Drk::Encode は Perl-XS を使った半角・全角・imode 絵文字処理を高速処理することが可能です。オプションで ascii 文字、カナ文字の変換の on/off を設定することもできます。

METHODS

use Drk::Encode を宣言することで、以下のメソッドが利用可能になります。

 new()
 new( ASCII => 0||1 )
 new({ ASCII => 0||1, KANA => 0||1 } )

 コンストラクタ
  引数無しの時は、{ASCII =>0, KANA => 1} がデフォルト値となる。
  ASCII => 0 の時 ASCII 文字は変換対象外
  ASCII => 1 の時 ASCII 文字は変換対象
  KANA => 0 の時 カナ 文字は変換対象外
  KANA => 1 の時 カナ 文字は変換対象

 z2h( $string)
 z2h( $string, 'euc'||'sjis' )
 z2h( $string, 'euc'||'sjis', 0||1 )
 z2h( $string, 'euc'||'sjis', { ASCII => 0||1, KANA => 0||1 } )

 全角→半角変換
  引数無しの時は、'euc', {ASCII =>0, KANA => 1} がデフォルト値となる。
  'euc' の時は $string を 'euc' と見なす。'sjis' の時は $string を 'sjis' と見なす。
  文字コードの自動判定は実装されていないので明示的に指定下さい。
  ASCII => 0 の時 ASCII 文字は変換対象外
  ASCII => 1 の時 ASCII 文字は変換対象
  KANA => 0 の時 カナ 文字は変換対象外
  KANA => 1 の時 カナ 文字は変換対象

 h2z( $string )
 h2z( $string, 'euc'||'sjis' )
 h2z( $string, 'euc'||'sjis', 0||1 )
 h2z( $string, 'euc'||'sjis', { ASCII => 0||1, KANA => 0||1 } )

 半角→全角変換
  引数無しの時は、'euc', {ASCII =>0, KANA => 1} がデフォルト値となる。
  'euc' の時は $string を 'euc' と見なす。'sjis' の時は $string を 'sjis' と見なす。
  文字コードの自動判定は実装されていないので明示的に指定下さい。
  ASCII => 0 の時 ASCII 文字は変換対象外
  ASCII => 1 の時 ASCII 文字は変換対象
  KANA => 0 の時 カナ 文字は変換対象外
  KANA => 1 の時 カナ 文字は変換対象

 imode_enc( $string )

 絵文字→escape済み式絵文字変換
  $stringは sjis 変換済みが前提です。

 imode_dec( $string )

 escape済み式絵文字→絵文字変換
  $stringは sjis 変換済みが前提です。

EXAMPLES

use strict;
use Drk::Encode;
my $m = Drk::Encode->new({ASCII=>1, KANA=>0});

my $zenkaku = 'ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾ
ダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマ
ムメモャヤュユョヨラリルレロヮワヰヱヲンヴ「、。・゛゜ー」 
!”#$%&’()*+,ー./0123456789:;<=>?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ[¥]^_`
abcdefghijklmnopqrstuvwxyz{|}〜
';
print $m->z2h($zenkaku,'euc');

my $hankaku = 'ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾ
ダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマ
ムメモャヤュユョヨラリルレロヮワヰヱヲンヴ「、。・゙゚ー」 
!"#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO
PQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
';
print $m->h2z($zenkaku,'euc');
- スポンサーリンク -