• ベストアンサー

Jcode.pmでconvertできない

あけましておめでとうございます。 早速ですが、皆様のお力を拝借したく。 WindowsXPSP2+ActivePerl5.6.1でJcode.pmを使用して、utf8へ変換しようとしました。 http://okwave.jp/qa2600582.html を参考にJcode.pmを導入し(とある事情でインストールしておりません)、以下のソースを記述しました。 ちなみに"sjis"で記述しております。 #!/usr/local/bin/perl use lib "./lib"; use Jcode; $buf = "てすてすてす"; print "BeforeCode=".Jcode::getcode($buf)."\n"; Jcode::convert( \$buf, "utf8"); #$j = Jcode->new($buf); #$buf = $j->utf8; print "$buf\n"; print "AfterCode=".Jcode::getcode($buf)."\n"; exit; すると BeforeCode=sjis AfterCode=euc と表示され、"utf8"を指定したにも関わらず、"euc"に変換されてしまいました。 次に、上記ソースの中ほどを #Jcode::convert( \$buf, "utf8"); $j = Jcode->new($buf); $buf = $j->utf8; と書き換えてみました。すると、 BeforeCode=sjis Undefined subroutine &Jcode::_Classic::euc_utf8 called at lib/Jcode/_Classic.pm line 255. とエラーが出てしまいます。 見た感じeuc_utf8が存在しないと言われているようですが、Jcode\Unicode\NoXS.pmに存在しています。 環境に問題があるような気はしますが、どのようにすれば"utf8"への変換が成功するのでしょうか?ご教授いただければ幸いです。 ちなみに上記ソースで Jcode::convert( \$buf, "jis"); Jcode::convert( \$buf, "euc"); Jcode::convert( \$buf, "sjis"); はすべて成功し、指定した文字コードに変換されました。 "utf8"への変換だけが失敗するという状況で、新年早々頭を抱えております。

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

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

Walrus,Digit. Perlメモ/日本語の扱い>Perl5.6とJcodeモジュール>Unicodeの変換。 ――とかが参考になるかも。 http://digit.que.ne.jp/work/index.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#pNoXS_utf

misshiki
質問者

お礼

ご回答ありがとうございます。 ご投稿いただいた内容で無事解決することができました。ありがとうございました。 ちなみに参考URLの内容はJcode.pmの2.01版に関してでしたが、2.06版でもほぼ同様でした。 以下に、ソース変更箇所を記しておきます。 対象:Jcode::unicode::NoXS.pm 1.関数定義の変更  sub Jcode::ucs2_euc{  sub Jcode::euc_ucs2{  sub Jcode::euc_utf8{  sub Jcode::utf8_euc{  sub Jcode::ucs2_utf8{  sub Jcode::utf8_ucs2{ 以上の関数定義の"Jcode::" -> "Jcode::_Classic::"に変更 2.sub Jcode::_Classic::euc_utf8内の処理  &Jcode::euc_ucs2($r_str);  &Jcode::ucs2_utf8($r_str); を  &Jcode::_Classic::euc_ucs2($r_str);  &Jcode::_Classic::ucs2_utf8($r_str); に変更 3.sub Jcode::_Classic::utf8_euc内の処理  &Jcode::utf8_ucs2($r_str);  &Jcode::ucs2_euc($r_str); を  &Jcode::_Classic::utf8_ucs2($r_str);  &Jcode::_Classic::ucs2_euc($r_str); に変更 以上の変更を施したところ、sjisの文字列$bufに対して Jcode::convert( \$buf, "utf8"); もしくは $j = Jcode->new($buf); $buf = $j->utf8; が正常に$bufをutf8に変換することを確認。またutf8->sjisの変換も確認できました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

こんばんは。 NoXS.pmがあってもそれを見に行くようになっていないようです。 Jcode.pmの55行目付近に use vars qw($USE_CACHE $NOXS); $USE_CACHE = 1; $NOXS = 0; という行があるはずですので、$NOXS = 0 のほうを、0以外の値(1でいいと思います)に 変更してみてください。

misshiki
質問者

お礼

ご回答ありがとうございます。 ただ残念なことにこの方法では現象が変わらず、解決に至りませんでした。 こちらでJcode.pmのバージョンを書き漏らしていたのも原因かと思われます。ちなみにバージョンは2.06を使用しております。

すると、全ての回答が全文表示されます。

専門家に質問してみよう