- ベストアンサー
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"への変換だけが失敗するという状況で、新年早々頭を抱えております。
- みんなの回答 (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
その他の回答 (1)
- sakusaker7
- ベストアンサー率62% (800/1280)
こんばんは。 NoXS.pmがあってもそれを見に行くようになっていないようです。 Jcode.pmの55行目付近に use vars qw($USE_CACHE $NOXS); $USE_CACHE = 1; $NOXS = 0; という行があるはずですので、$NOXS = 0 のほうを、0以外の値(1でいいと思います)に 変更してみてください。
お礼
ご回答ありがとうございます。 ただ残念なことにこの方法では現象が変わらず、解決に至りませんでした。 こちらでJcode.pmのバージョンを書き漏らしていたのも原因かと思われます。ちなみにバージョンは2.06を使用しております。
お礼
ご回答ありがとうございます。 ご投稿いただいた内容で無事解決することができました。ありがとうございました。 ちなみに参考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の変換も確認できました。