• 締切済み

Jcodeのtrが遅いので代替のプログラムを作りたい

hikominの回答

  • hikomin
  • ベストアンサー率63% (40/63)
回答No.1

私はベンチマークを取っていないのですが、Perl 5.8でのマルチバイト環境ではどうですか?(逆質問?) use utf8; my $buffer = 'テスト用の文字列'; $buffer =~ tr/0-9A-Za-z/0-9A-Za-z/; #全角英数->半角英数 とか以下略で。いちいちJcodeインスタンスを作るとかよりはマシな気がしますが。 これで速くならないのであれば…うーん…。

ymda
質問者

お礼

うーん、お礼欄ですみません。 パクろうと思ったはずのJcode.pm v1.99 を test::Jcodeに変更して テストしてみたら、こっちのが8倍遅かったようです。汗 うーん、なぜだろう。汗 http://openlab.jp/Jcode/index-j.html

ymda
質問者

補足

速くなる前に、Webページ全体が文字化けしてしまいます。TT 内部コード、HTML出力すべてeuc-jpを使用しています。 呼び出し元:(これでヒットさせたい) use Search qw(Search); if (Search("モジレツ", "もじ")) { ヒット; } モジュール: sub Search { my($text,$keyword)=@_; $text=&test($text); $keyword=&test($keyword); return($text =~ /\Q$keyword\E/i); }

関連するQ&A

  • jcode.plのかわり

    jcode.plの jcode::tr() のかわりを探しています。 jcode.plの jcode::tr(\$val,'0-9A-Za-z ()_@-','0-9A-Za-z ()_@-'); をPerl5.18.2で使用するとエラーが出てしまいます。これを回避したい。 プログラムがUTF-8であれば $val =~ tr/0-9A-Za-z ()_@-/0-9A-Za-z ()_@-/; のようにすれば実現可能みたいですが、プログラムはEUCで書かれています。 影響範囲からプログラムの文字コードをかえることはできれば避けたい。 一文字ずつ変換することも考えましたが、この方法ではパフォーマンスに懸念があります。 jacode.plなるものもありますが、これに置き換えるだけでは文字化けしてしまいました。 jcode::tr()のかわりになるような手段はあるのでしょうか?

    • ベストアンサー
    • Perl
  • JcodeモジュールとEncodeモジュール

    以下、Perl5.8でJcodeモジュールを使った場合とEncodeモジュールを使った場合の違いについて、知りたいです。 ※そもそもこのモジュールは同時に使ったらだめなのでしょうか? use strict; use utf8; use Jcode; use Encode; my $dat1 = "あイ卯(1)Iⅰ"; Jcode::convert(\$dat1, "utf8"); my $dat2 = "あイ卯(1)Iⅰ"; $dat2 = Encode::encode("utf8", $dat2); 文字コード変換の正しい使い方が知りたいです。

    • ベストアンサー
    • Perl
  • Jcodeによるカタカナ→ひらがな変換

    初めて投稿させていただきます。 Perlで半角カタカナをひらがなに変換しているのですが、 以下のような文字列は文字化けが起こってしまいます。 オウシュウシ イイオカ コシオウ アカサカ キョウサカエ オオスケ  オオキシ キキョウ ソウカシ なんとなく法則がありそうなのですが、それがどういう理由なのかがわかりません。 たとえば、「アカサカ」は「鐔縁酋鐔誌酋」と化けてしまいます。 しかし、「アカサカチョウ」とした場合は化けません。 以下のようなコードを作成しています。 use Encode; use Jcode; $iline="文字列"; Encode::from_to( $iline, 'CP932', 'utf8'); my $str = Jcode->new($iline)->h2z->tr("ァ-ン", "ぁ-ん")->utf8; $strをファイルに出力 といった感じです。 文字コードの関係が弱いので、何をどうしたら良いのか検討がつきません。 何か参考になることを教えていただければ幸いです。 Perlのバージョン5.8.5 サーバー Linux系

    • ベストアンサー
    • Perl
  • Jcode,pmを使った連続変換に失敗してしまう

    フォームから入力された内容について、 全角数字を半角数字へ、半角カナを全角カナへ変換したいので、 Jcode.pmを使ったのですが、たとえば、 「全角数字を半角数字」だけとか、「半角カナを全角カナ」だけ だとうまくできますが、連続して両方変換しようとすると Jcodeのエラー「Not a SCALAR reference at Jcode.pm line 626」がかえってきてしまいます。 このようなコードを書いています。 use Jcode; $AAA = 'あいう012カキクser'; (実際はフォームからのデータ) &Jcode::convert(\$AAA, 'euc'); my $j = Jcode->new(); $j->set($AAA, 'euc'); $BBB = $j->tr('0-9A-Za-z', '0-9A-Za-z'); (数字変換:ここまでは成功する) my $j = Jcode->new(); $j->set($BBB, 'euc'); #1 $CCC = $j->h2z->euc; (カナ変換:失敗してエラーが発生する) コードはEUCで書いています。どうも #1 のところで、 2行上であらかじめJcodeによって変換されたものが格納されている 変数$BBBを指定するとエラーが起きるようです。#1のところで、 $j->set($AAA, 'euc'); #1 $CCC = $j->h2z->euc; とするとエラーは起きないのです。 変換の順番をいれかえても現象は同じでした。 どうすれば両方の変換ができるようになるでしょうか。 どうぞよろしくお願いします。

    • ベストアンサー
    • Perl
  • 全角英数字を自動的に半角変換するソース

    全角英数字を自動的に半角変換するソース パソコン初心者です。 以下は、 フォームに入力された全角英数字を自動的に半角に変換するソース(Javascript)のようなんですが どういった意味なのかよくわかりません。 一体どういう仕組みなんですか?? function zentohan(obj){ if(typeof(obj.value)!="string")return false; var han= '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@-.,:'; var zen= '1234567890abcdefghijklmnopqrstuvwxyz            ABCDEFGHIJKLMNOPQRSTUVWXYZ@-.,:'; var word = obj.value; for(i=0;i<zen.length;i++){ var regex = new RegExp(zen[i],"gm"); word = word.replace(regex,han[i]); } obj.value = word; }

  • Jcodeモジュールの代わりにjcode.plで代用可能でしょうか?

    こんばんわ。前回質問したときに、 回答をしていただいた方、ありがとうございました。 原因は、結局のところ、サーバー会社の自分の使っているサーバーに ImageMagickがインストール?されていなかったみたいでした。 使えないのですが、(使用では使えることになっていた。) と、連絡したところ、無事使えるようになりました。 ありがとうございました。 ですが、実際、ImageMagickを使ってみて、 その機能の一部である、文字合成については英数字のみできました。 プログラムのuseにある、Jcodeが、働いていないみたいでした。 これはサーバーのサポート外なので、どうしようもないのですが。 そこで、思いついたのは、jcode.plを使って、なんとかならないかなー?と、思ったのですが、これはさすがに、無理でしょうか? 当然できたとしても難しいとは思うのですが、どうでしょう? 無理でしょうか? できるのでしょうか?できたとしても、かなり難しいのでしょうか? できるとしたら、どんな感じに組めばいいのか、参考になるアドバイスがいただけたらと、思っているのですが。 よろしくお願いします。 ↓は日本語が表示されなかった、プログラムです。 #!/usr/local/bin/perl -w use strict; use Jcode; use Image::Magick; # 画像を指定 my $file = "sample.jpg"; # 合成したい文字列 my $text = "ABC123日本語"; # UTF-8へ変換 $text = jcode($text)->utf8; # オブジェクト作成 my $image = Image::Magick->new; # 画像読み込み $image->Read($file); # 文字を記入する $image->Annotate(text=>$text, stroke=>'#FFFFFF', fill=>'#005599', font=>'sazanami-gothic.ttf', pointsize=>'36', x=>'20', y=>'40', encoding=>'UTF-8'); # 画像出力 print "Content-type: image/jpeg\n\n"; binmode STDOUT; $image->Write('jpeg:-'); undef $image; exit; よろしくお願いします。 ありがとうございました。 よろしくお願いします。

  • Encodeモジュールで日本語化したい

    今まで全てのPerlをjcode.plを使って日本語化してきました。 長年根本の構造をきちんと理解せず、jcode.plは呪文のように最初に宣言して使用してきたため、現在文字化け対策をするため、今回Encodeモジュールを使って日本語変換を行うための方法が分からず困っています。 formから送信されてきたものを変換するため、 foreach $pair(@pairs) { ($name,$value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); $in{$name} = $value;#ここは状況に応じて変えてます } として最初に一括して変換してやり、 ウェブ上で表示させるときは <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> を指定してそのまま表示、 メールなどでは &jis("Subject: $sub"); print AAA "$msg\n"; sub jis { $msg = $_[0]; &jcode'convert(*msg, 'jis'); } などとして出力してきました。 これらをEncodeモジュールを使って書き換えたいのですが、参考に http://digit.que.ne.jp/work/wiki.cgi?Perl%E3%83%A1%E3%83%A2%2F%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E6%89%B1%E3%81%84 このページを読んだのですが、perlの根本が理解できていないので、どこをどうしていいのか分かりません。 上のような形式をEncodeモジュールを使って書き換えるとすればどのようにすればいいのでしょうか。 (どう聞けばいいかも分からないので、うまく伝えられたか不安ですが)

    • ベストアンサー
    • Perl
  • PerlでUTF8をEUCに変換

    こんにちは、お力を貸して下さい。 OSX上で日本語のファイル名を取得し そのファイル名をeucに変換しようとすると 半濁音付きのカナが文字化けを起こしてしまうのです。 Web上で “$euc = Jcode($euc, 'utf8')->z2h->h2z->euc;” で、できないこともないみたいだったので、さっそくやってみたんですが… 変換したいファイル名は、「1ドキュメント」とします。 -------------------------------------- #!/usr/bin/perl use strict; use Jcode; my $path = "パスがはいっている"; my @files; opendir DIR, $path; @files = grep /^1/ && -f "$path/$_", readdir(DIR); closedir DIR; foreach (@files) { my $euc = $_; $euc = Jcode->new($euc, 'utf8')->z2h->h2z->euc; print "$euc\n"; } exit; -------------------------------------- 結果:1ト〓キュメント やっぱり文字化けしましたTT 新しい解決法がありましたら、よろしくお願いします。

    • ベストアンサー
    • Perl
  • MP3情報の表示

    Windowsで作ったMP3ファイルのタグ情報をちゃんと表示するためにPerlスクリプトを作っているのですが、 Jcodeでeucに変換する所でエラーになってしまいます。 どこをどう直せばちゃんと表示できるようになるのかわかる方がいらっしゃいましたら教えてください。 == mp3info.pl ====== #!/usr/local/bin/perl -w use MP3::Info; use Data::Dumper; usr Jcode; my $file = $ARGV[0]; my $tag = get_mp3tag($file); my $info = get_mp3info$file); my $jtag = jcode($tag)->euc; print Dumper($jtag, $info); ============ $./mp3info.pl aaa.mp3 $Not a SCALAR reference at /usr/lib/perl5/site_perl/5.6.1/i686-linux-multi/Jcode.pm line 579.

    • ベストアンサー
    • Perl
  • CGIデコードでつまづいています。

    PerlCGIのデコードでつまづいています。jcode.plで$valueの値を「%E3%81%BF%E3%81%AE%E3%82%8A%E5%8F%B0」から「みのり台」の日本語に変換しようとしたのですが「%E3%81%BF%E3%81%AE%E3%82%8A%E5%8F%B0」が返されてうまくいきません。申し訳ありませんが知恵を貸して頂けないでしょうか、よろしくお願い致します。 #!/usr/bin/perl require './jcode.pl'; #デコードするためのプログラム # プラウザからのデータ取込み #if ($ENV{'REQUEST_METHOD'} eq "POST") { # read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); #} #else { $buffer = $ENV{'QUERY_STRING'}; #} # プラウザからのデータ変換 #$i = 0; #※2 @pairs = split(/&/,$buffer); foreach $pair (@pairs) { #1行毎に$name,$valueを取り出す ($name, $value) = split(/=/, $pair); # 変換演算子 tr + を スペースに置き換え # $value =~ tr/+/ /; # 変換演算子 s/// 単語の構成文字にマッチ # $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # " を &quot; に変換 # $value =~ s/"/&quot;/g; #\n を "" に変換 # $value =~ s/\n//g; print qq(   <tr><td>やった</td></tr>   ) , "\n"; # jcodeでデコードがうまく出来ませんでした。 # 日本語に変換(デコード処理部分) &jcode'convert(*value,'sjis'); &jcode'convert(*$name,'sjis'); # $FORM{$name} = $value; #※1 # @num[$i]=$value; #※2 # $i=$i++; #※2 # $str = decode('shiftjis', $value); # $value = encode('shiftjis', $str); } @varuee = split(/&*q=/,$ENV{'QUERY_STRING'}); print qq(   <HTML>   <HEAD>   <TITLE>画像の検索結果</TITLE>   </HEAD>   <BODY bgcolor="#FFFFFF">  <H2 align="center">画像データベースの検索結果</H2>  <!--画像の検索結果を2~3件ためしに表示-->  <BR>   <hr>   <CENTER>   <table> ); print qq(   <tr><td>$value</td></tr>   ) , "\n"; exit;

    • ベストアンサー
    • Perl