WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:日本語をPOSTで送信したいのですが・・・

0:[投稿] ポルコ [2005/09/30 17:40 ][環境:OS:WINXP・WEBサーバー:TOMCAT4.1・perlの種類とver:PERL for MSWIN32 v5.8.7 ブラウザ:IE6 上記と同様です。ローカルで行っています。]

はじめまして。
プログラマをやってるポルコといいます。
HTML&CGIでホームページ作成をするのは、
初めてでほとんど知識がありません。
今までにC言語とVBをかじった程度の経験があります。

タイトルの件につきまして、
ご存知の方がいらっしゃいましたら、
ご教授頂きたく書き込みさせてもらいます。

テキストファイルをCGIで読み込み、
TEXTAREAで表示・編集後、
別のCGIに引渡し、再度テキストファイル保存する
というものを作ってます。

別のCGIに引き渡す際、日本語が内容に混じっていると
文字コード関係なく、以下のように化けます。
例:プロパティ
%3Fv%3F%3F%3Fp%3Fe%3FB
というような化け方です。
フォームの送信をGETで行えば上手くいくのですが、
容量が8000バイトを上回ると容量オーバーを起こす
ようでしたのでPOSTを使用しています。
受け側でデコードしようとしたのですが、
READ関数
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
を使い取得した時点で、
上記のようなエンコードデータになってしまっています。

HTML&CGIスクリプトを全てSJISで保存しようと
UTF-8で保存しようと結果は同じでした。

どうすれば良いのか、わからず困っています。

以上、宜しくお願い致します。


1:[回答] miz [2005/09/30 20:59 ]

>例:プロパティ
>%3Fv%3F%3F%3Fp%3Fe%3FB
>というような化け方です。

これはurlエンコードといって、インターネット経由で送信する時は必ずこのような形式に変換しなければなりません。form送信時はブラウザが自動で変換してくれます。
よって化けているのではなくこれが正しく受信したデータです。
getだとこの形式にならないというのも不思議なんですけど、フォーム送信ではなくリンクにqueryでくっつけてるのでしょうか?。
通常は、この形式で受け取った後に、デコードという作業をして、多バイト文字や記号に戻します。
perlだとこんな感じで
   $value = ...   ### 受け取りデータを入れる
   $value =~ tr/+/ /;            #←↓デコード
   $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;

CGI.pmやcgi-lib.plを利用すると、データ受信時にこの変換を自動でやってくれる関数があります。


2:[回答] 神崎 [2005/09/30 23:52 ]

IE6は、URLに日本語を使えるので、(日本語ドメインへの対応)
(日本語環境のIE6のみ。
Windowsのバージョン、サービスパックのバージョンにより異なります)
GETで送ると、日本語のままになるかもしれません。
サーバーや経路が日本語URLに対応していない場合、エラーになる可能性もあります。

URLに使用できるのはたしか256バイトだったと思うので、
IEにより拡張されているかも知れませんが、経路やブラウザにより、とぎれる可能性もあります。

URLエンコードについてはmizさんの通りです。


3:[回答] 通りがかり。 [2005/10/01 01:20 ]

>URLに使用できるのはたしか256バイトだったと思うので、

いえ、決まりはありませんよ。
ブラウザーの仕様によります。
いずれにしても、長いデータを送ることについて不向きなのは確か。

しかしC言語をやっている人が、文字化けと思うのは……???
見ただけで、わかりそうなものだと思いますが。


4:[回答] tuishin [2005/10/01 11:03 ]

postで送られるデータはURLエンコードされます。
けっして、HTMLやCSSのせいではないのだけれど。
おじゃましました。


5:[回答] ポルコ [2005/10/03 12:53 ]

mizさん、神崎さん、通りがかりさん、tuishinさん
回答有難う御座います。

いくつか説明が足りませんでした、申し訳ないです。

機能自体は、HTMLとCGIのみで作成しています。
フォーム送信の対象はTEXTAREAとHIDDENです。
HIDDENにはファイルのアドレスが、
TEXTAREAにはファイルのデータが入っていると思って下さい。
フォーム送信はPOSTで行っています。
リンクにqueryという形はとっていません。
文字化けって言い方は他に言い方が思いつかなかったので
文字化けという言い方をしました。
文字コードはShift_JISを使用しています。
例えば、「プロパティ」という文字の場合、
GETであろうとPOSTであろうと、送信の際のエンコードは
%83v%83%8D%83p%83e%83B
という認識でおりました。
ですけど、POST送信後では
%3Fv%3F%3F%3Fp%3Fe%3FB
という化け方をしてしまうのです。
よって、これをデコードしても
?v???p?e?Bという文字列になってしまいます。
(変換自体は、mizさんのおっしゃるやり方をしています)
GET送信であれば、受け渡しに成功しているのですが
POST送信だとデーコド前に文字コードが崩れてしまって
いる状態です。
また、POSTは最初の書き込みの通り、容量の問題から
GETではなくPOSTを利用しています。

このような現象が起こる原因を自分では、
特定できませんでした。

恐れいりますが、ご存知なのであれば
教えていただければと思います。


6:[回答] レミー [2005/10/03 14:55 ]

>>文字コードはShift_JISを使用しています
>>HTML&CGIスクリプトを全てSJISで保存しようと
>>UTF-8で保存しようと結果は同じでした。

文字コードを指定するのと使用するのは違いますよ。
使用する文字コードは何でもいいんです。ブラウザ
が「指定」したコードマップに合ったものを表示し
てくれさえすれば。

ちゃんと指定していますか?
HTMLファイルとサーバーの文字コードが異なると管理
が面倒なので通常同じにします。サーバーがEUCで動く
ならHTMLファイルも全てEUCで書き、保存します。


7:[回答] AC1号 [2005/10/03 22:58 ]

フォーム受け取り側CGIには、"?v???p?e?B"がURIエンコードされた"%3Fv%3F%3F%3Fp%3Fe%3FB"が送られてきています。フォームを送る際に、すでにWebブラウザは"?v???p?e?B"を送ることを決めています。

一般的なWebブラウザの実装は、送られてきたHTMLファイルの文字コードと同じエンコーディングでURIエンコードするようになっています。Webブラウザが、HTMLファイルの文字コードがShift_JISと判断すれば、"%83v%83%8D%83p%83e%83B"を送ると考えられます。しかし、何らかの原因で別の文字コードと勘違いしたのでしょう。

>TEXTAREAで表示・編集後、
の部分はCGI(perl?)のようなので、Content-Typeを出す部分を以下のようにして文字コードを明示してみるとどうでしょうか。
print "Content-Type: text/html; charset=Shift_JIS\n\n";


8:[完了] ポルコ [2005/10/04 14:39 ]

レミーさん、AC1号さん
回答、どうもありがとうございました。

WEBサーバーにTOMCAT4.1.32を用いていたのですが、
どうもその仕様に引っかかっていたようです。
TOMCATの場合、POST送信に未対応という情報を
見つけて、もしや!?と思って試してみたら、
プロパティがプロパテ?と進歩することが出来ました。
サーバーの問題とは、露ほども気づきませんでした。
今後は気をつけようと思います。

助言下さった、みなさんご協力有難う御座いました。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World