• 締切済み

日本語文字化け(GETメソッド?)

以下のようにすると日本語の受け渡しがうまくいきません。(抜粋) そももこの場合、日本語の受け渡しは、出来ないのでしょうか。 それともコンバートのやり方がまずいのでしょうか。 お知恵をおかしください。宜しくお願い致します。 URL:test.cgi?name=日本語 #!/usr/local/bin/perl require './cgi-lib.pl'; require './jcode.pl'; # 読込 &getinput; $name = $form{'name'}; print "Content-Type: text/html\n\n", $name; exit; sub getinput { &ReadParse; while (($key,$val) = each %in) { &jcode'convert(*val, "sjis", "", "z"); $form{$key} = $val; } }

みんなの回答

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.4

この問題は、かなり以前にわたくしもぶつかったことがあり、他人事と思えなかったので解答させて頂きたいと思います。 URL(現URI)の中には半角文字といえども使うと不都合が生じる文字があります。 たとえば、「?」や「&」は用途が限定されているので変換しないと受け渡される側で問題が生じます。 日本語の場合は全角文字として2バイト以上のコードを使いますので見かけ上は文字列でも見えない部分で禁則文字が使われる可能性があります。 よって、GETメソッドなどで限定されないパラメータをCGIに受け渡す場合は、URLエンコードを行うのが基本となります。 cgi-lib.plのReadParseには自動でデコード機能がついておりますので、受け取り時のデコードは気にしなくても良いと思います。 ただし、上記のものは強制できることではありませんので、問題が生じるリスクを覚悟で、やる・やらないは自由にしてください。 文字化けに関しては、利用されている環境が不明なので(というか普通は誰がどんな環境でアクセスするかわからないですね。)、こちらのサンプルの場合、出力内容がHTMLではないのに「text/html」となっており、redfox63さんの仰る通りに強制的に文字コードを指定したHTMLを出力するのがまず「ありき」かと思います。 上記点で解決しないのなら、ご自身のブラウザの表示設定がおかしいと思って間違いありません。 HTMLでなく「text/plain」として出力を行うのであれば、かならずブラウザ側の表示設定にて日本語コードを調整する必要があります。 CGIに渡すパラメータは出来るだけPOSTメソッドにすることをおすすめいたします。

regregreg
質問者

お礼

回答いただきありがとうございます。 やはり、POSTメソッドに落ち着く!! GETメソッドでもうまくいけば、ログ項目を変更せずにそのままつかえたのですが・・・残念!!

すると、全ての回答が全文表示されます。
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <meta http-equiv="Content-Language" content="ja"> <title>Test Perl</title> </head> <body> <form name="oForm" method="post" action="test.cgi" target="myFrame"> <input name="name" value="日本語"><input type="submit" value="送信"> </form> <iframe name="myFrame" src></iframe> </body> </html> といったソースでうまく表示できてます このHTMLファイルを EUCで保存して IIS5.1で実行してますが文字化けはしないようですよ ブラウザのソース表示では文字化けしますけどね ... メモ帳ですから

regregreg
質問者

お礼

回答いただきありがとうございます。 以下の記述でボタンなどをクリックせず表示させたいのですが、良い方法はないものでしょうか。 <iframe src="test.cgi?name=花子" width=500 height=100 scrolling=no frameborder=0 marginwidth=0 marginheight=0></iframe>

すると、全ての回答が全文表示されます。
  • mflow
  • ベストアンサー率63% (42/66)
回答No.2

日本語はURLエンコードをした上でURLにセットしてください。出力されるHTMLの文字コードとperlソースの文字コードが一致してることを注意してください。 my $URLencode = '日本語'; $URLencode=~s/([^0-9A-Za-z_ ])/'%'.unpack('H2',$1)/ge; $URLencode=~s/\s/+/g; として、 URL:"test.cgi?name=".$URLencode てな感じにしてください。

regregreg
質問者

お礼

回答いただきありがとうございます。 >日本語はURLエンコードをした上でURLにセットしてください。 URLエンコードしないでやる方法は、無いのでしょうか。 これがうまくいけば、HTMLのIFRAMEタグで、CGIを実行し、日本語検索でデータを抽出できるのではと思っています。

すると、全ての回答が全文表示されます。
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

Content-typeの出力時に charset=shift_jisなどを追加してみてはいかがでしょう print "Content-type:text/html;charset=shift_jis\n\n", $name; といった具合です

regregreg
質問者

お礼

回答いただきありがとうございます。 試しに行って見ましたがこちらも結果NGでした。

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

関連するQ&A