Perl5.18.2でjcode::tr()のかわりを探しています

このQ&Aのポイント
  • jcode.plのかわりを探しています。Perl5.18.2でjcode::tr()を使用するとエラーが出てしまいます。
  • プログラムがUTF-8であれば$val =~ tr/0-9A-Za-z ()_@-/0-9A-Za-z ()_@-/;のように実現可能ですが、プログラムはEUCで書かれています。一文字ずつ変換することも考えましたが、パフォーマンスに懸念があります。
  • jacode.plに置き換えるだけでは文字化けしてしまいました。jcode::tr()のかわりになる手段はあるのでしょうか?
回答を見る
  • ベストアンサー

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
  • 回答数7
  • ありがとう数14

質問者が選んだベストアンサー

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.7

UTF-8 の内部文字列にすれば、tr で文字単位で変換することができます。プログラムのソースが EUC-JP でとのことなので、少し厄介なところはあります。 use strict; use Encode; use NKF; my $str = "\xAD\xEA0101アア"; $str = decode 'utf8', nkf('-Ew', $str); my $from = decode 'utf8', nkf('-Ew', '0-9A-Za-z ()_@ー'); eval "\$str =~ tr/$from/0-9A-Za-z ()_\@-/;"; $str = nkf '-We', encode('utf8', $str); print "$str\n"; 私の Linux 上のパソコンでは、上記のコードで (株) は文字化けせずに全角の0と1を半角に変換します。

miyan2000
質問者

お礼

ありがとうございます。 無事変換できました。 意図してない半角カナまで全角になってますが、 それも必要なことなので問題ありませんでした。

その他の回答 (6)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.6

(株) のような特殊な文字では、Jcode から利用している Encode.pm でもうまく行かないことがあります。(株) の場合は、「euc-jp → utf8」は変換できるが、「utf8 → euc-jp」は変換できないようです (No4 の補足に書かれているとおりです)。 use Encode; print encode('utf8', decode('euc-jp', "\xAD\xEA")), "\n"; # 端末UTF-8: OK print encode('euc-jp', decode('utf8', "\xE3\x88\xB1")), "\n"; # 端末euc-jp: NG 日本語変換ユーティリティ nkf が NKF.pm を提供しています。Encode.pm で「UTF-8バイト <-> UTF-8内部」を、NKF.pm で「UTF-8バイト <-> EUC-JP」を処理すると、うまく行くかも?

miyan2000
質問者

補足

文字を EUC→UTF-8→EUC にするだけなら Unicode::Japanese を使えば可能でした。 問題は任意の文字を変換することです。 0-9a-z を 0-9a-z のように半角にするとか。全角文字を全部半角にすることは出来るんですが 上記のように英数字だけとかが出来ないんです。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.5

「文字化け」とかいう曖昧な情報では埒があきません。 odを使って、どんなデータになっているか調べましょう #1にあったスクリプトを LANG=C od -t x1c スクリプト と16進と文字とで表示します。 非ASCII文字を表示させないために、LANG=Cにしておきます。 次のように表示されるかと思います。 0000000 75 73 65 20 4a 63 6f 64 65 3b 0a 0a 6d 79 20 24       u s e J c o d e ; \n \n m y $ 0000020 73 74 72 20 3d 20 22 28 b3 f4 29 a3 b0 a3 b1 30       s t r = " ( 263 364 ) 243 260 243 261 0 # ここの特性上、位置がずれてしまいます EUC-JPで書いてあれば、「株」にあたるコードは b3 f4 になっているはずです。 8a 94 ならShift JIS, e6 a0 aa ならUTF-8です。 次に、実行結果のダンプを取ります perl スクリプト | LANG=C od -t x1c 本来なら、 ここでも b3 f4 になっているはずです。 もし b3 f4 ならば、使っている端末アプリケーションが文字化けの原因です。(LANGはeucJPになっているけど、端末の文字コード設定が別なものになっている、とか) もし、それ以外のコードになっているなら、JCodeでの変換がなにかうまくいっていない、ということになります。

miyan2000
質問者

補足

いろいろ考えていただきありがとうございます。 1つお詫びです。 普通の感じの「株」でなく「(株)」のような機種依存文字が化けます。 教えて頂いた方法でいろいろ試してみました。 まず「株」で 何も変換せずダンプ b3 f4 0a UTF-8に変換 e6 a0 aa 0a UTF-8に変換後、EUCに変換 b3 f4 0a 元に戻っているのでロジックや確認方法は正しく行えていると思います。 次に「(株)」 何も変換せずダンプ ad ea 0a UTF-8に変換 e3 88 b1 0a UTF-8に変換後、EUCに変換 3f 0a こっちは元に戻りませんでした。 やはりJcodeの文字コード変換では対応出来ていない部分があるようです。

  • kichi8000
  • ベストアンサー率41% (658/1580)
回答No.4

文字コードの指定には、"jis"、"sjis"、 "euc"、"ucs2"、"utf8"が使えます。 my $str = "(株)0101アア"; $codes = Jcode::getcode(); $str = Jcode->new( $str, 'euc')->utf8; このutf8変換後の$codesと$strの文字列内容を教えていただけませんか。 ucs2ではないかと思うので、こうするとどうでしょうか。 my $str = "(株)0101アア"; $codes = Jcode::getcode(); $str = Jcode->new( $str, 'ucs2')->utf8;

miyan2000
質問者

補足

$codesには ascii が入ってました。 $str = Jcode->new( $str, 'euc')->utf8; で実行した結果、コンソールの表示文字列をUTF8にしたら化けてなかったので UTF8には変換出来ているようです。 この状態で $str = Jcode->new( $str, 'utf8')->euc; を実行すると株が化けます。 JcodeではUTF-8からEUCに変換できない文字があるんですかね?

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

私の手許の環境では文字化けしません。 UTF-8の端末で実行していたり、スクリプトがEUC-JPではなかったりしませんか?

miyan2000
質問者

補足

Solaris10でLANGはja_JP.eucJPになってるんですけどねぇ。 スクリプトもEUCになってますし。 普通の文字は文字化けしませんが、カッコ株のような特殊な文字がダメです。

  • kichi8000
  • ベストアンサー率41% (658/1580)
回答No.2

文字列をUTF-8に変換してから文字列操作するのが基本ですよ。

miyan2000
質問者

補足

カッコ株はEUC→UTF-8→EUCにするだけでも文字化けしてしまいます。 ---------------------------------- use Jcode; my $str = "(株)0101アア"; $str = Jcode->new( $str, 'euc')->utf8; $str = Jcode->new( $str, 'utf8')->euc; print $str."\n"; ---------------------------------- これはまた別問題ですが・・・・

  • kichi8000
  • ベストアンサー率41% (658/1580)
回答No.1

Jcode.pm などはどうでしょうか。 Jcode呼び出しの"J"は大文字になります。 http://openlab.jp/Jcode/index-j.html

miyan2000
質問者

補足

ご回答ありがとうございます。 use Jcode; my $str = "(株)0101アア"; my $j = Jcode->new($str, 'euc'); $str= $j->tr('0-9A-Za-z ()_@-','0-9A-Za-z ()_@-'); print $str."\n"; こんな感じで実行すると、全角数字を半角に変換は出来ましたが (株)が文字化けしてしまいまいした。

関連するQ&A

  • jcode.plのバグでしょうか?KCctchでの質問です。

    PerlのプログラムをKCatch.pmで調べていましたが。 次のような表示がされました。 jcode.plのバグでしょうか?プログラムに問題があるのでしょうか? お教えいただければ幸いです。 ../data/clients.txtが開けません。 Catch: Thu Jun 21 08:54:31 2001 -------------------------------------------------------------------------------- [jcode.pl:366:warn] Use of uninitialized value at jcode.pl line 366. > sub max { $_[ $[ + ($_[$[] < $_[$[+1]) ]; } [jcode.pl:362:warn] Use of uninitialized value at jcode.pl line 362. > $code = ('euc', undef, 'sjis')[($sjis<=>$euc) + $[ + 1]; -------------------------------------------------------------------------------- anquit.cgi with Perl 5.00502 for freebsd

    • ベストアンサー
    • Perl
  • jcode.pl

    日記などのスクリプトを作成しているのですが、とりあえず今まで、そこまでの理由もわからず他のスクリプトに習ってjcode.plをデコード処理部で &jcode'convert(*value,'sjis'); &jcode'convert(*name,'sjis'); のように使ってきました。 ですが、たまたま今回、jcode.pl等を書き忘れてしまったのですが、ブラウザから投稿してみても文字化けという文字化けが起こりません。スクリプト自身はsjisで書いています。ログファイルもどうやらsjisコードで書き込まれているようなのですが、それでもjcode.plは必要なのでしょうか。windows XP にApache + Active Perl での動作と、@niftyで設置して動作を確認しました。 この場合、jcode.plは必要あるのでしょうか?

    • ベストアンサー
    • Perl
  • jcode.plについて

    次のエラーが発生します。 Undefined subroutine &jcode::convf called at ./jcode.pl line 291. カレントに、jcode.plを置いているだけでは動作するのでしょうか? また、Jcode.pmを使った場合、 &Jcode::convert(\$test_sjis, "sjis"); と大文字にしないといけないのですが、これは仕方ないことでしょうか? てっきり、 require './jcode.pl'と use Jcode.pmの差し替えで済むと思っていました。 #!/usr/bin/perl require './jcode.pl'; my $test = "パソコン結構です。"; #文字化けチェック用 my $test_sjis = $test; my $test_ujis = $test; my $test_jis = $test; &jcode::convert(\$test_sjis, "sjis"); &jcode::convert(\$test_ujis, "ujis"); &jcode::convert(\$test_jis, "jis"); print "\$test_sjis=[$test_sjis]\n"; print "\$test_ujis=[$test_ujis]\n"; print "\$test_jis =[$test_jis]\n"; exit; __END__

    • ベストアンサー
    • Perl
  • 全角英数字を半角英数字に変換したい

    全角英数字を半角英数字に変換する方法を教えて下さい。 $data =~ tr/0-9a-zA-Z/0-9a-zA-Z/; 以上のようにした場合、J-perl意外では望みどおりに変換されません。 jcode.plをつかって 全角英数字を半角英数字に変換する方法があると、 書かれていた方がいましたので、 できればjcode.plをつかった場合の 具体的なスクリプトの書き方を教えて下さい。 よろしくお願いいたします。

    • ベストアンサー
    • 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
  • jcode.pl 使い方

    いままで、日本語を使わなかったのですが、 今、開発中のCGIでは日本語を処理しています。 ローカルサーバでのテストでは問題なかったのですが、βテストを開始してみると、環境によって文字化け。 出力する同じHTMLの中に場合によってEUCとS-JISなどが混在する状況になってしまいました。 そこで、jcode.plを使用し、コードの統一を行おうと思うのですが、日本語での解説ページまた、使用方法を解説している質問、回答が見つからなかったので、関数の使用方法を教えていただきたく思います。 私は、英語がすごく苦手なのでjcode.plの中の使用方法を見ても全く読めなかったのです。 日本語で分かりやすく書いていただけると幸いです。

    • ベストアンサー
    • Perl
  • 「jcode.pl」というファイルはどこにUPすべきでしょう?

    「jcode.pl」というファイルはどこにUPすべきでしょう? ただいまサーバー移転をしているのですが(サーバー移転は初めてです) 移転後、ひとつひとつファイルを確認していると「jcode.pl」というファイルを発見しました。 拡張子から、Perlで記述されたプログラムかな?と判断いたしました。 もしそうならば、サーバーで指定されているPerlのパスにしたがって移動させるべきでしょうか? ちなみにこのファイルは、サーバーの(いじれる部分の)第2階層にはいっています。 Perlのパスは /usr/local/bin/perl です。 しかし、上記のパスの位置に、私が入って行くことは出来ません。 動かす必要はあるのでしょうか? 当方初心者です。まとはずれな質問をしているかもしれませんが どうぞよろしくお願い致します。

  • jcode.plのconvertを使用しなければならない場面とは?

    こんにちは。 jcode.plのconvertがjis,sjis,euc 間の相互変換が 行えるのはわかりました。 しかしながら、その用途がよくわかりません。 日本語にはその3種類の漢字コードがよく使われているのは なんとなくわかるのですが それを例えば &jcode::convert(\$test,'sjis'); というように、sjisにするというのは、どのような場面があって どのような必要性があってそのようにするのか? またeucに変換しなければならない場面等、 ネットで調べましたがその点がよくわからないのです。 例えば、Windows環境で生成されたテキストファイルの文字列を読み込んで Linux環境のPerlで出力しようとする時に、不具合が出るので 日本語は必ずEUCで変換する、など。 (この文章が正しいのかどうか適当です。 このような場面が世の中にはあって、その場合はこうする、というような 例として書きました) ご存知の方、どうぞよろしくお願いします。

    • ベストアンサー
    • Perl
  • 機種依存文字(株)のコード変換について

    perlのバージョンがあがった関係で、jcode.plをJcode.pmに対応する為に記述方法の変更に奮闘中です 機種依存文字(株)に関してうまくいかないようで、下記のように文字化けしてしまいました 例1) $a="あ(株)";->あ+機種依存文字(株) Jcode::convert(\$a,'euc'); print"$a"; ->あ? 例2) $a="あ(株)";->あ+機種依存文字(株) $a= jcode($a)->h2z->euc; print"$a"; ->あ? 例3) $a="あ(株)";->あ+機種依存文字(株) $a = Jcode->new($a,"euc")->tr("あ","わ")->h2z->euc; print"$a"; ->わ? 各記述の後、$a内の機種依存文字(株)は?になってしまいます 機種依存文字(株)としてそのまま認識したいのですが、どのような記述にすればいいのかわかりません (機種依存文字(株)以外の文字化けはまだ調べていません) ※perl5.8.7では認識されず、以前のperlのバージョン5.005_03ではそのまま認識されています ご教授宜しく御願いします

    • ベストアンサー
    • Perl
  • 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; よろしくお願いします。 ありがとうございました。 よろしくお願いします。

専門家に質問してみよう