• ベストアンサー

半角カナから全角カナに変換

Jcode.pmを使用して半角カナから全角カナに変換したいのです。 こちらの過去ログを拝見し、以下のようなロジックを記述したのですが、 ”Undefined subroutine &Jcode::h2z_euc called at test_jcode.pl line 7.”というエラーが出てしまいます。 use Jcode; $line = 'アイウエオ'; $ato = &Jcode::h2z_euc(\$line); print $ato, "\n"; どなたかご回答よろしくお願いいたします。

  • you_s
  • お礼率40% (6/15)
  • Perl
  • 回答数8
  • ありがとう数3

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

  • ベストアンサー
  • alicia-y
  • ベストアンサー率40% (85/208)
回答No.8

$line に入っている文字コードの判別に失敗しているのかもしれません。 Jcode->new($line,'euc')->h2z->sjis; のように指定すると上手くいきませんか? sjis にする必要が無い場合は Jcode->new($line,'euc')->h2z; でいいはずです。

you_s
質問者

お礼

(1)"アイウエオ" (2)"ア\nイ\nウ\nエオ" (3)"アイウエオ" (2)や(3)だと半角から全角へ変換されるのですが, (1)だとうまくいきません。 先輩に聞いたところ,Oracleで同じような事をしてくれる関数があるようなので、そちらを試してみることにします。 多数の回答ありがとうございました。

その他の回答 (7)

  • alicia-y
  • ベストアンサー率40% (85/208)
回答No.7

> 全角から半角への変換はうまくいったのですが、 これは、Jcode->new($line)->z2h->euc; としたと言うことですか? z2h を使わないと全角から半角へは変換しないはずですが。 > 半角から全角への変換がうまくいきません。 $line に半角カナが入っているんですよね? Jcode->new($line)->h2z->euc; 私が試した限りではこれで上手く行くんですけど。 > 原因として、半角カナがeucである事だと考えられるのです。 > そこで、euc から sjis へ変更しようとしたのですが,うまくいきません。 sjis に変換するには、 Jcode->new($line)->sjis; です。 半角->全角変換も同時にする場合は Jcode->new($line)->h2z->sjis; です。

you_s
質問者

補足

>これは、Jcode->new($line)->z2h->euc; としたと言うことですか? そうです。すみません。説明不足で… Jcode->new($line)->sjis; 上記を試してみましたが,sjisへ変換できないのです。 変換さえできればうまくいくと思うのですが…

  • alicia-y
  • ベストアンサー率40% (85/208)
回答No.6

use Jcode; $line = "アイウエオ"; $s = Jcode->new($line)->h2z->euc; print $s,"\n"; で上手くいきませんか?

you_s
質問者

補足

全角から半角への変換はうまくいったのですが、 半角から全角への変換がうまくいきません。 原因として、半角カナがeucである事だと考えられるのです。 そこで、euc から sjis へ変更しようとしたのですが,うまくいきません。 何が問題なのでしょうか。

  • 2nd
  • ベストアンサー率30% (19/63)
回答No.5

そういえば、私も &Jcode::h2z がうまく使えなかった記憶があります。 で、結局以下のようにしました。 use Jcode::H2Z; $line = 'アイウエオ'; &Jcode::H2Z::h2z(\$line); print $line, "\n"; Jcode モジュールをインストールしたのなら、Jcode::H2Z はインストール されているはずなので、これでできるのではないかと。 Jcode.pm を読むと、Jcode::h2z って Jcode::H2Z::h2z を呼び出していた だけだったので。

you_s
質問者

補足

試してみましたが,出来ませんでした。 $lineに全角カナをいれると全角カナのまま 半角カナをいれると半角カナのまま出力されてしまいます。 Jcode::convertを使用して現在の文字コードを出力させたところ、うまく出ましたので,Jcodeモジュール自体は正しくインストールされているはずなのですが。。。

  • alicia-y
  • ベストアンサー率40% (85/208)
回答No.4

Jcode.pm には h2z_euc は無いみたいですが、 use Jcode; $s = Jcode->new($s)->h2z->euc; で出来ませんか。

you_s
質問者

補足

試してみたのですが,変換したい文字列をどこに記述すればよいのかわかりません。 教えてください。

  • slackware
  • ベストアンサー率59% (22/37)
回答No.3

$ato = &Jcode::h2z_euc(\$line); の部分を $ato = &Jcode::h2z(\$line); に変更してもダメでしょうか.

you_s
質問者

補足

$ato = &Jcode::h2z(\$line); $ato = &{$Jcode::h2z{'euc'}}(\$line) 上記のように、インターネットなどで記載されている使用方法は全てやってみたのですが,うまくいかないのです。 やはりjcode.plでないとだめなのでしょうか。

noname#225520
noname#225520
回答No.2

Jcode.pmは使ったことがありませんでした。 Perlのバージョン等は大丈夫なのですよね?

参考URL:
http://openlab.ring.gr.jp/Jcode/index-j.html
you_s
質問者

補足

バージョンは、5.6.630(最新)です。 Jcode.pmに移行するには以下の2点を変更するだけで、ほぼいけるという記述をインターネットで見つけたのですが,できません。 (1)require jcode.pl → use Jcode; (2)jcode:: → Jcode:: Jcode.pmでは出来ないということであれば、jcode.plを使用使用とは思っているのですが。。。

noname#225520
noname#225520
回答No.1

jcode.plというライブラリを使用するのですよね? ならば require "jcode.pl"; $line = "アイウエオ"; &jcode'h2z_euc(*$line); print "$line\n"; でイケると思うのですが。。

you_s
質問者

補足

jcode.plではなく、jcode.plの後継モジュールJcode.pmでは出来ないのですか。 出来ないのであればjcode.plでやります。。。

関連するQ&A

  • Jcode.pmでの半角カナ→全角カナ変換

    Webフォームから取得したデータに半角カナが含まれていた場合の文字化け対策として、Jcode.pmを使用して、下記のようにEUCに変換しています。 use Jcode; $euc_string = jcode($form_input)->h2z->euc; 原理的には間違ってはいない筈ですが、ほとんどの場合、$form_inputの文字コードの判別に失敗(恐らく半角カナをEUCと誤認)し、文字化けしてしまいます。誤認しないように、下記の様に記述すれば、正しく全角カナに変換してくれます。 use Jcode; $euc_string = jcode($form_input,"sjis")->h2z->euc; ただ、入力コードがシフトJISとは限りませんので、この記述は好ましくないと思っています。 半角カナの文字化けは、webフォームを作られた方なら皆さん経験されていると思うのですが、どうされているのでしょうか? Jcode.pmの文字コード判別は、半角カナが混じっていた場合、かなり長い文字列でないと判別に失敗するようなので、フォームで短い文字列(名前等)を入力させて処理させた場合、ほとんど上手く動かないようなのですが?

    • ベストアンサー
    • Perl
  • 半角カナから全角カナへ

    お世話になります。 今、フォームから入力された半角カナを全角カナへ変換しようとしているのですが、どうしてもうまく行きません。 処理は以下のようにしています。 jcode::convert(\$str, 'euc'); if($str =~ /[\xA1-\xDF]/){ jcode::h2z_euc(\$str); } (1)まず、半角カナが含まれているかのチェックで[\xA1-\xDF]を使用していますが色々調べたところ、実際は (?:\x8E[\xA6-\xDF]) が正しいようなのですが、この場合文字数が少ないとひっかかってくれません。例えば半角のア1文字や2文字など。また、文字数が多くても半角英数と半角カナが混在しているとひっかからない場合もあります。 上記の式だとひっかかってくれますが、この判定で構わないのでしょうか。 (2)上記の式できちんと置換されるものとされないで漢字のように文字化けするものと出てきてしまいます。 例えば「インターフェース」などという半角は全滅です。 「バージョン」などは大丈夫でした。 間違いなど教えて頂ければと思います。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 半角→全角変換

    数値、記号、カナのすべてを半角から全角に変換したく Encode::JP::H2Zを利用しサンプルプログラムを書いてみました。 セーブは、s-jisで行っているのですが以下のコードを試しましたがまったく変換されません。何処がいけないのでしょうか? 以下を実行すると、 h2z: 012ABCabc!@#ア??ガダパ h2z: となってしまいます。 #!/usr/bin/perl use Encode; use Encode::JP::H2Z; my $str_h = ' 012ABCabc!@#アイウガダパ'; my $str_2 = '  012AbCabc!@#アイウガダパ'; my $char_conv; $char_conv = Encode::encode("euc-jp", $str_h); Encode::JP::H2Z::h2z(\$char_conv); $char_conv = Encode::decode("euc-jp", $char_conv); print " h2z:" . $char_conv . "\n"; $char_conv = Encode::encode("euc-jp", $str_h2); Encode::JP::H2Z::h2z(\$char_conv); $char_conv = Encode::decode("euc-jp", $char_conv); print " h2z:" . $char_conv . "\n";

    • ベストアンサー
    • 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は、最新のものを使っています。 #↓=============================================== ##### フォームデータ受け取り if ($ENV{'REQUEST_METHOD'} eq 'POST') {  read( STDIN , $buffer , $ENV{'CONTENT_LENGTH'} ); } else {  $buffer = $ENV{'QUERY_STRING'}; } # 文字コードを正確に取得するために,全ての送信データをいったん文字コードチェックする $buffer1 = $buffer; $buffer1 =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $kcode = &jcode::getcode(*buffer1); @pairs = split(/&/ , $buffer); ##### フォームデータのデコード、漢字コードをsjisに変換 foreach $pair (@pairs) {  ($k,$v) = split(/=/,$pair);  $v =~ tr/+/ /;  $v =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;  &jcode'convert(*v,"sjis",$kcode);  # 半角カナを全角に変換  if($kcode eq 'sjis') {   &jcode::h2z_sjis(\$v);  }  if($kcode eq 'euc') {   &jcode::h2z_euc(\$v);  }  if($kcode eq 'jis') {   &jcode::h2z_jis(\$v);  }  $in{$k} = $v; } #↑=============================================== (なお、全角スペースは、半角スペースなどに変更願います。) よろしくお願いします。

  • perlで半角カナを検索するには、どうしたらいいのでしょうか?

    perl初心者です。 下記のようなファイルがあったとします。 パナソニック(ナショナル) 三菱電機 日立 東芝 SONY 下記のように、書きました while (<IN>) { use Jcode; Jcode::convert($_, 'euc'); chomp; $line+=1; Jcode::convert($_, 'euc'); if ($_=~ /\x8E/) { print "行=$line $_\n"; } } できあがったファイルは、下記のように、半角カナではなく、字化け状態になってしまいました。 行=2 姉鰭電機 行=4 東芝 よろしくお願い致します。

  • 全角英数字を半角英数字に変換したい

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

    • ベストアンサー
    • Perl
  • perl jcode::convert 半角>全角

    perlでjcode::convertで 半角を全角に変換すると 正しく変換される時とされない時があります。 例えば、 sample1.plとsample2.plの my $message = 'の次の「ハンカク」の4文字は半角の文字です。 (注)ここにアップロードすると全角で表示されてしまいます。   この4文字を半角にして確認してください。 sample1.plではこの4文字が全角に変換されるのですが sample2.plではこの4文字は半角のままです。 なぜ全角に変換されないのでしょうか。 (Windows7, ActivePerl v5.16.3) ---sample1.pl------------ require "jcode.pl"; my $message = 'ハンカク文字は使えるかな?'; jcode::convert(\$message,"sjis","", "z"); print "$message\n"; --------------- ---sample2.pl------------ require "jcode.pl"; my $message = 'ハンカク文字'; jcode::convert(\$message,"sjis","", "z"); print "$message\n"; --------------- なお、どちらも以下のようなメッセージが表示されています。 これは何を意味しているのでしょうか。 defined(%hash) is deprecated at C:/Perl64/site/lib/jcode.pl line 684. (Maybe you should just omit the defined()?) defined(%hash) is deprecated at C:/Perl64/site/lib/jcode.pl line 693. (Maybe you should just omit the defined()?)

    • ベストアンサー
    • Perl
  • 入力フォームからの半角カナを認識させたい

    入力フォームからの半角カナを全角に変換したいのですが、方法はありますでしょうか。 h2z_sjisを使ってみましたが、うまく行きませんでした。 foreach $pair (@pairs){ ($name, $value) = split(/=/, $pair); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*name,'sjis'); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); &jcode'h2z_sjis(*value); $FORM{$name} = $value; } <結果> アイウエオ(半角) → 渦慨オ よろしくお願いします。

    • ベストアンサー
    • 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