う~む、何か、Jcode.pm を使って、EUC から UTF-8 に変換しようとすると、
Undefined subroutine &Jcode::_Classic::euc_utf8 called at lib/Jcode/_Classic.pm line 255.
てなエラーが出てしまう。
サイトによっては「Perl のバージョンが古いせい」とか訳の分からない説明をしてるところもあるけど、実際にはそんな単純な話ではない。
この原因は、ちゃんと Jcode.pm のインストール時に make; make install をして Unicode.pm を作成していないから。
なので、本来なら make して、Unicode.pm を作ってやるのが一番だが、ホスティング環境によっては SSH 接続等でのシェル使用を許してなくて(FTP のみ可とかで) make 出来ないケースもあるしな。
解決策として、
Jcode/_Classic.pm の 255行目付近を、
と変更し、Jcode::Unicode(Unocode.pm)の euc_utf8 ではなく、Unicode/NoXS.pm 内の Jcode::euc_utf8 を呼ぶようにしてやると書いているサイトもあるが嘘。
これだと、確かにエラーで落ちることはなくなるが、UTF-8 がらみの変換が正しく行われない。
UTF-8 がらみの変換、
とか
が正しく行われるようにするには、Jcode/Unicode/NoXS.pm を以下のように編集する。
これでバッチリ!
Jcode/_Classic.pm の編集はしちゃあいかんぜ。
Tweet
Undefined subroutine &Jcode::_Classic::euc_utf8 called at lib/Jcode/_Classic.pm line 255.
てなエラーが出てしまう。
サイトによっては「Perl のバージョンが古いせい」とか訳の分からない説明をしてるところもあるけど、実際にはそんな単純な話ではない。
この原因は、ちゃんと Jcode.pm のインストール時に make; make install をして Unicode.pm を作成していないから。
なので、本来なら make して、Unicode.pm を作ってやるのが一番だが、ホスティング環境によっては SSH 接続等でのシェル使用を許してなくて(FTP のみ可とかで) make 出来ないケースもあるしな。
解決策として、
Jcode/_Classic.pm の 255行目付近を、
sub utf8{
load_module("Jcode::Unicode");
euc_utf8(${$_[0]->[0]});
}
↓
sub utf8{
load_module("Jcode::Unicode");
Jcode::euc_utf8(${$_[0]->[0]});
}
と変更し、Jcode::Unicode(Unocode.pm)の euc_utf8 ではなく、Unicode/NoXS.pm 内の Jcode::euc_utf8 を呼ぶようにしてやると書いているサイトもあるが嘘。
これだと、確かにエラーで落ちることはなくなるが、UTF-8 がらみの変換が正しく行われない。
UTF-8 がらみの変換、
$str = Jcode->new($str, 'utf8')->h2z->jis;
とか
$str = Jcode->new($str, 'utf8')->h2z->euc;
が正しく行われるようにするには、Jcode/Unicode/NoXS.pm を以下のように編集する。
% diff NoXS.pm NoXS.pm_org
56c56
< sub Jcode::_Classic::ucs2_euc{
---
> sub Jcode::ucs2_euc{
71c71
< sub Jcode::_Classic::euc_ucs2{
---
> sub Jcode::euc_ucs2{
87c87
< sub Jcode::_Classic::euc_utf8{
---
> sub Jcode::euc_utf8{
90,91c90,91
< &Jcode::_Classic::euc_ucs2($r_str);
< &Jcode::_Classic::ucs2_utf8($r_str);
---
> &Jcode::euc_ucs2($r_str);
> &Jcode::ucs2_utf8($r_str);
94c94
< sub Jcode::_Classic::utf8_euc{
---
> sub Jcode::utf8_euc{
97,98c97,98
< &Jcode::_Classic::utf8_ucs2($r_str);
< &Jcode::_Classic::ucs2_euc($r_str);
---
> &Jcode::utf8_ucs2($r_str);
> &Jcode::ucs2_euc($r_str);
101c101
< sub Jcode::_Classic::ucs2_utf8{
---
> sub Jcode::ucs2_utf8{
124c124
< sub Jcode::_Classic::utf8_ucs2{
---
> sub Jcode::utf8_ucs2{
これでバッチリ!
Jcode/_Classic.pm の編集はしちゃあいかんぜ。
コメントする