EUCで書いたCGIに、JISで出力させるには?

[上に] [前に] [次に]
とっく 1999/11/03(水) 01:22:43
CGIはEUCで書いて、JISで出力しようと思ったのですが、
Shift_JISだと(最初の方にopen(STDOUT, "|nkf32 -s");とかくと)うまくいくのに、
JISだと(最初の方にopen(STDOUT, "|nkf32 -j");とかくと)文字が化けてしまいます。
標準出力に出力する前に、ファイルに出力したりしているのですが、
その時点ですでに化けてしまっています。(あいうえお→う髟阡擦い・逅擦┐/TD>)
原因が分かりません。教えていただけないでしょうか。

B-Cus 1999/11/04(木) 00:59:31
少なくとも STDOUT を nkf32 経由にしたところで、
他のファイルハンドルへの出力が化けることはあり得ないと
思うんですが、もしかして Windows ならではの問題があるのかしら?

本当に
 open(STDOUT, "|nkf32 -s");
だとOKだけど、
 open(STDOUT, "|nkf32 -j");
と1文字変えただけで、ファイルへの出力が化けるんですか?

とっく 1999/11/04(木) 01:55:36
ありがとうございます、B-Cusさん。
CGIがEUCで書かれているので、
ファイルへはEUCで出力して、
標準出力へはJISで出力したいのです。
標準出力をShift_JISにすると全部うまくいくのですが。

B-Cus 1999/11/04(木) 02:26:35
いや、それはわかるんですけど、とっくさんが言われる症状は
僕は「起こるはずがない」と思うので、
> 本当に
>  open(STDOUT, "|nkf32 -s");
> だとOKだけど、
>  open(STDOUT, "|nkf32 -j");
> と1文字変えただけで、ファイルへの出力が化けるんですか?
ということを確認したいわけです。

だって、
 open(OUT, ">file");
 print OUT "ほげ";
 open(STDOUT, "|nkf32 -j");
 print "ほげ";
としても、STDOUT の nkf のオプションが、OUTへの出力内容に
影響を与えるはずがないと思うから。

再度聞きますが、`-s' を `-j' に変えただけで、全く無関係の
ファイルへの出力が化けるんですか?

もしその答えが YES なら、残念ながら僕には原因がわかりません。

moci 1999/11/04(木) 02:36:16
open(STDOUT, "|nkf32 -j");
をコメントアウトした時の出力を確認してみるというのは
いかがでしょう。コードが入り混じっているんじゃないでしょうか。

とっく 1999/11/04(木) 02:45:48
すみません。さっきは確かにShift_JISにすることで、
文字化けを回避できた・・と思ったのですが・・・(?)
今試してみたら、JIS同様に化けてしまいました。
「かきくけこ」や「さしすせそ」は化けないのですが。

とっく 1999/11/04(木) 02:51:17
なんどもすみません。
やっぱり-jを-sに変えるだけでうまくいきました。

>mociさん
コメントアウトすればちゃんと文字化けせずにEUCで出力されます。

moci 1999/11/04(木) 03:18:21
ファイルへの出力でしたね、すみません。
そのファイルへの出力のもとはなんなのでしょう?

PTAN 1999/11/04(木) 10:45:53
半角カナが入っている場合等、元の文字コード判定に失敗
してしまうので、
open(STDOUT, "|nkf32 -jE");
としてみるとか...

とっく 1999/11/04(木) 19:26:39
>mociさん
フォームから送られてきたデータ(JIS)を
jcode.plでEUCに変換して、いくつか処理を行い、
ファイルに出力(EUC)しているのですが。

>PTANさん
試してみましたが、うまくいきませんでした。

ぎん [HomePage] 1999/11/09(火) 17:59:36
ちょっと確認したいのですが、

そのCGIは、SSIなどでの部分出力ではない、
つまり、<html>〜</html>のHTML全体を出力して
いるのですよね?

であれば、
http://www.tohoho-web.com/wwwxx005.htm
を参考にして、以下を先頭で出力する様にしてみては?

print "Content-Type: text/html; charset=iso-2022-jp\n\n"
print "\<HTML\>"
print "\<META HTTP-EQUIV=\"Content-type\" \n"
print "  CONTENT=\"text/html; charset=iso-2022-jp\">\n"
print "\<\!-- あ龠ョク --\>"

もし、SSIなどで、部分的なHTMLの出力なら、
他の部分とコードが、違っているなども、考えられます。

既にテスト・確認済などでしたら、ごめんなさい。

ぎん 1999/11/09(火) 18:06:11
うわぁ。
コメントの部分で、3Fxxのコード文字で漢字にあるのを、
探して書いたら化けてしまいました。
コメントの部分は、適当に入力してください。
また、やったかなぁ。機種依存文字。。。すみませんでした。

とっく 1999/11/09(火) 19:11:56
>そのCGIは、SSIなどでの部分出力ではない、
>つまり、<html>〜</html>のHTML全体を出力して
>いるのですよね?
はい。
ファイルへ出力する文字列が化けているので、
関係ないと思うのですが・・・。
(「さしすせそ」などは化けません。)

ぎん 1999/11/10(水) 09:56:22
また勘違いしてました。ファイル内容が化けるのでしたか。

サーバーによって、
テキスト形式として、JISコードで保存するのが好ましくない
のかも、知れません。
Unix,Linuxであれば、ファイルは(HTMLも含めて)
EUCで保存するのが、標準だと思います。
以前、私も、シフトJISで保存したファイルに対して、
>(リダクション)や|(パイプ)などテキスト形式で処理
するコマンドが反応しなくなった事が有ります。
この場合も、
恐らく、制御用のコードなどが出現してしまった
のではないかと思います。
サーバーは何を使っているのか解りませんが、
それに合うコードで保存して、取り出す時にまた変換する
という様には、出来ないのでしょうか?

とっく 1999/11/10(水) 15:34:08
CGIがEUCなので、ファイルへの出力もEUCにしています。
標準出力に出力するときだけnkfでJISにしています。
nkfを使わなければ化けません。
環境は
Win98 + Apache/1.3.6(Win32) + perl5.005_03 + nkf1.7 for Win32
です。

とっく 1999/11/10(水) 15:37:08
上の方で
open(STDOUT, "|nkf32 -s");
と書くと化けないけど、
open(STDOUT, "|nkf32 -j");
と書くと化ける、と書きましたが、
別のCGIで同じことを試してみると、
どちらも化けました。

ぎん 1999/11/10(水) 16:20:07
たびたび、失礼っ。
Win98だと、シフトJISで、CGIを作成した方がいいと
思います。
私には、それが原因の様に思えるのですが。。。

きたむら 1999/11/10(水) 17:48:28
ひょっとしたら、Perlのバグかも。
うちの古いPerl for Win32(perl5.003_07ベース)などは
もっと悲惨でして、Win95で以下のコードを実行すると

open(STDOUT, "|nkf32 -j");
print "あいうえお\n";
close(STDOUT);

これだけでハングアップ(?)してしまいました(T_T)。
ちなみに以下のコードは、うまく動作しました。

open(NKF, "|nkf32 -j");
select(NKF);
print "あいうえお\n";
close(NKF);

とっく 1999/11/10(水) 22:30:07
上で他のCGIで試してみると、
Shift_JISでも化けたと書きましたが、
やっぱりShift_JISだと化けませんでした。
何度もすみません。
たぶんjcode.plのJISからEUCに変換するところに
問題があるような気がするのですが・・・。
今はちょっと試せませんが、NKF.pmを使ってみることにします。

>ぎんさん
Shift_JISにしてもダメでした。
それにShift_JISはいろいろ問題があるので・・・。

>きたむらさん
試してみましたがダメでした。

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