jcode.plやnkfを使わないで漢字コード変換をするには?

[上に] [前に] [次に]
miyu 1999/05/20(木) 16:09:34
SSIを利用してアクセスのたびに挨拶文をかえるスクリプトを
作っています.挨拶文をいれたファイルを読み込んでランダムに
表示するのですが,そのときに文字列を置換することもあり,
挨拶文ファイルもスクリプトファイルもeucで処理しています.
すると,埋め込むHTMLファイルはJISコードなので,
当然その挨拶文だけ文字化けしてしまうのですが,
文字化けを防ぐ方法はありますでしょうか?

「こんなのjcode.plかnkfをつかえば簡単だ」と思われるかも
しれませんが,設置するサーバではnkfは使えず,また,
jcode.plがなぜか取り込めません.
#require 'jcode.pl';と書いたところでスクリプトを終了
するらしいけれど,shellが使えないので詳細は不明です

そのスクリプトは他のサーバでは問題なく動作しています.

なえ 1999/05/20(木) 16:43:26
>#require 'jcode.pl';
実際のコードでは頭の#はついてないですよね?
#以降はコメントだって事くらい知ってますよね?
それからSSIで起動する処理の中での相対パスの指定は、
スクリプトのあるディレクトリからのパスじゃなく、
SSIを埋め込んでるHTMLのあるディレクトリからのパスになるらしい??(よく知りません(^^;)

あと文字化けを防ぐ方法としてはHTMLをEUCにしちゃうってのはどうでしょうか?
FTPでアップするときにEUCに指定するだけだから、簡単だと思いますけど。

miyu 1999/05/20(木) 17:04:23
>>#require 'jcode.pl';
>実際のコードでは頭の#はついてないですよね?
もちろんついていません.
#しかもここの#は全角です.いくらそそっかしくてもそんなへまは
#しません.

また,ここではrequire 'jcode.pl';と書いていますが,
実際は絶対パスで指定しています.相対パスで指定しても(./jcode.plなど)
症状は変わりません.本当に#でコメントアウトすると,文字化けしますが動作します.jcode.plを取り込むと表示すらしません.
ちなみにperlのバージョンは5.003らしいです.

>あと文字化けを防ぐ方法としてはHTMLをEUCにしちゃうってのはどうでしょうか?
どうしても方法がないのなら,この方法を採用しますが,
せいぜい数十文字のことでeucにするのも何なので,
あまり使いたくないテです.(^^;)

B-Cus 1999/05/20(木) 17:12:20
> それからSSIで起動する処理の中での相対パスの指定は、
> スクリプトのあるディレクトリからのパスじゃなく、
> SSIを埋め込んでるHTMLのあるディレクトリからのパスになるらしい??

少なくとも apacheではそうなります。
# <!--#exec cmd="...."--> が解釈/実行される時点では、カレントディレクトリが
# そのHTMLの置いてあるディレクトリになっている、というべきでしょうか。

> require 'jcode.pl';

@INCのパスが通ってないだけじゃなくて?
HTMLと同じ場所に jcode.plを置いて、
 require './jcode.pl';
としてもダメですか?

miyu 1999/05/20(木) 17:13:42
説明不足だったので補足します.
>本当に#でコメントアウトすると,文字化けしますが動作します.>jcode.plを取り込むと表示すらしません.
jcode.plをとりこんだところで,それ以降の処理がまったく
行われません.シェルが使えないので,どのように終了しているのか
エラーがあればどのように落ちているのかも確認ができないのです.
しかも,ほかのサーバでは,jcode.plをいれてもいれなくても,
jcode.plを入れなければ文字化けする以外は同じように動作するので,
原因や解決法がつかめないでいるのです.

B-Cus 1999/05/20(木) 17:22:11
あ、絶対パスで書いてもダメってことは、@INCの問題じゃないのかも…。

 #!/usr/local/bin/perl
 $|=1;
 print "Content-type: text/plain\n\n";
 open(PERL,"/usr/local/bin/perl -e 'require \'/home/hoge/jcode.pl\';' 2>&1|");
 print <PERL>;

これを使うと、jcode.plが見つからないのか、jcode.plが
parse errorになってるのかわかるはずです。

なえ 1999/05/20(木) 17:33:58
requireしてる所で以上終了してるなら、jcode.plが見つからない可能性が高いです。

require 'jcode.pl'; この文を

eval("require 'jcode.pl'");
print $@;

って書き換えて試してみてください。

miyu 1999/05/21(金) 00:14:40
B-Cusさんのスクリプトを試したところ,以下のような出力がでました.
どうなればよいのかよく分からなかったので,そのままのせておきます.
なお,この例ではjcode.plを相対パス(./jcode.pl)で指定しています.

Content-type: text/plain Warning: Use of "require" without parens is ambiguous
at -e line 1. Search pattern not terminated at -e line 1.

また,なえさんの示した方法を用いたところ,require以降の
スクリプトを実行するようになりました.$@には何も入って
いない様でした.これは絶対パスでも相対パスでも同じでした.
-----------
$codef = "/usr/hogehoge/miyu/jcode.pl";
if( -e $codef ){
print $codef; #check用.実行時には表示された
eval("require '$codef'");
print $@;
}
---------
この例では
コード変換用の関数
&jcode'convert(*value,'jis');
以降の行が実行されずに落ちてしまい,当初の
目的が達成できないままです.


なえ 1999/05/21(金) 01:25:20
$@に何も入ってなかったのならrequireは成功してると言うことなのになぜ?
うー、あと考えられることは〜........
jcode.plファイル壊れてないですか?
もしくは漢字コードがEUCになってないとか?

なえ 1999/05/21(金) 01:32:23
って、jcode.plは全角文字使ってないから漢字コードは関係ないですね。
あとは、改行コードだけど、FTPでアップするときちゃんとASCIIモードでアップしてますよね?


ところで関係ないけど、ユーザーディレクトリが/usr/配下にあるなんて、変わったディレクトリ構成してるんですね。

匿名希望 1999/05/21(金) 13:13:32
perl5003はバグが有るって聞いたような記憶が...
あいまいな記憶ですが(^^;

miyu 1999/05/21(金) 13:18:50
[[解決]]
>jcode.plファイル壊れてないですか?

このラウンジに質問する前に確認したとき,
手元にあるファイルとサーバにあげたファイルと比較して容量も
変わっていないし,改行コードもUNIX形式になっていたので
壊れていないと判断したのですが,
改めて,正常に動作しているサーバにあげていたjcode.plと
比較すると明らかに容量が違っていて,大元のjcode.pl自体が
壊れていたようです.

家に帰らないと確認できませんが,おそらくjcode.plを正常なものに
更新するとうまくいくものと思われます.一応,「解決」マークをチェックしておきます.
なえさん,B-Cusさん,どうもありがとうございました.

>ところで関係ないけど、ユーザーディレクトリが/usr/配下にあるなんて、変わったディレクトリ構成してるんですね。
ですね.(^^;) apacheのディレクトリにユーザのwwwディレクトリを
作っていて(ってどこかバレバレですね),それをユーザディレクトリ
からシンボリックリンクを貼っているのだと思います.
(あくまで推測:-)プロバイダは教えてくれない)
wwwディレクトリ以外のところには(自分のホームディレクトリでさえも)書き込めないようになっています.


よもぎ 1999/05/23(日) 23:49:30
jcode.plが壊れている可能性もあるかもしれませんが,perl
がjperlになっていませんでしょうか?

そうだとするとエラーが出る可能性があります.
http://www.att.or.jp/perl/unixperl.html

miyu 1999/05/24(月) 01:18:47
>家に帰らないと確認できませんが,おそらくjcode.plを正常なものに
>更新するとうまくいくものと思われます.

どんぴしゃりでした.改めてjcode.plを入手してputしたところ
正常に機能しました.

[上に] [前に] [次に]