投稿日:2005年11月09日 作成鷹の巣

No.19806 CGIでのファイル名の文字コードがうまくいかない。



CGIでのファイル名の文字コードがうまくいかない。

No.19806 投稿時間:2005年11月09日(Wed) 14:01 投稿者名:初心者 URL:

どなたか、教えてください。
CGIを使用して、ファイルのダウンロードを作成したのですが、ファイル名の文字コードがうまくいかないのです。
半角英数字のファイル名であれば、ダウンロードは可能です。
しかし、漢字+カタカナと、カタカナのファイル名がダウンロード出来ません。

どなたか対処方法を教えてください。

ちなみに、現在localhostで作業しています。WindowsXPで、WEBサーバは、Apacheを使用しています。
宜しくお願いします。


CGIに限らず。

No.19807 投稿時間:2005年11月09日(Wed) 17:38 投稿者名:Reboot URL:

> どなたか、教えてください。
> CGIを使用して、ファイルのダウンロードを作成したのですが、ファイル名の文字コードがうまくいかないのです。
> 半角英数字のファイル名であれば、ダウンロードは可能です。
> しかし、漢字+カタカナと、カタカナのファイル名がダウンロード出来ません。
>
> どなたか対処方法を教えてください。
>
> ちなみに、現在localhostで作業しています。WindowsXPで、WEBサーバは、Apacheを使用しています。
> 宜しくお願いします。

原因はCGIで使っている日本語文字コードと、サーバが使っている日本語文字コードが
違うことではないでしょうか。一般的にネット上で使うファイル・ディレクトリの名前
は、下記のようにした方がよいとされています。

以下 FTP ソフト、FFFTP のQ&Aからの抜粋です。

ファイル名に漢字、空白文字などを使っている場合
ホスト側で漢字のファイル名が使えない場合に漢字のファイル名を使うと、ダウンロード、アップロードが
できない場合があります。 漢字のファイル名は使わないでください。
また、空白文字や一部の記号などがファイル名に含まれていると、アップロードできない場合があります。
(使える記号、使えない記号は、ホストによって違いがあります。)


以下とほほのWWW入門より抜粋

ファイル名に関する注意
ホームページで作成する HTML文書や画像ファイルのファイル名は、
以下の点に注意してください。
・ 基本的に 半角英数字 のみを用いる。
・ 使用可能な記号はドット(.)、ハイフン(-)、アンダーバー(_)程度。
・ スペース文字を含んだファイル名は使用しない。
・ 大文字・小文字をちゃんと使い分ける。


どんな現象になるのですか。

No.19810 投稿時間:2005年11月09日(Wed) 18:03 投稿者名:松元 URL:

> どなたか、教えてください。
> CGIを使用して、ファイルのダウンロードを作成したのですが、ファイル名の文字コードがうまくいかないのです。
> 半角英数字のファイル名であれば、ダウンロードは可能です。
> しかし、漢字+カタカナと、カタカナのファイル名がダウンロード出来ません。
>
> どなたか対処方法を教えてください。
>
> ちなみに、現在localhostで作業しています。WindowsXPで、WEBサーバは、Apacheを使用しています。
> 宜しくお願いします。

CGIそのもののファイル名称を漢字にしたのか、
ダウンロードするファイルの元ファイル名が漢字
ダウンロードしたファイルが漢字
url はどんな風に指定したか、POST が GET なのか。
ファイル名は input text などで指定するのか

クライアントを限定すれば動作するとは思われますが
CGIの作り方が悪いのか操作なのか設定なのか
どんなCGIなのかも分からないので答え様がない。

ダウンロード出来ません ではどんな現象になるのですか
ログは?


not found on this server.

No.19811 投稿時間:2005年11月10日(Thu) 15:53 投稿者名:初心者 URL:

> > どなたか、教えてください。
> > CGIを使用して、ファイルのダウンロードを作成したのですが、ファイル名の文字コードがうまくいかないのです。
> > 半角英数字のファイル名であれば、ダウンロードは可能です。
> > しかし、漢字+カタカナと、カタカナのファイル名がダウンロード出来ません。
> >
> > どなたか対処方法を教えてください。
> >
> > ちなみに、現在localhostで作業しています。WindowsXPで、WEBサーバは、Apacheを使用しています。
> > 宜しくお願いします。
>
> CGIそのもののファイル名称を漢字にしたのか、
> ダウンロードするファイルの元ファイル名が漢字
> ダウンロードしたファイルが漢字

CGIそのもののファイル名称は、"download.cgi"です。
ダウンロードするファイルの元ファイル名が漢字または漢字+カタカナです。

> url はどんな風に指定したか、POST が GET なのか。
これがファイルのプロパティで表示されるアドレスです。
「https://localhost/petition/CSsupport/download.cgi?page=Download&dir=&sort=date&filename=新規テキスト文書.lzh」

> ダウンロード出来ません ではどんな現象になるのですか
> ログは?

上記をクリックすると、アドレス部分が「https://localhost/petition/CSsupport/upload/新規テキスト文書.lzh」となり以下のメッセージが表示されます。
Not Found
The requested URL /petition/CSsupport/upload/譁ー隕上ユ繧ュ繧ケ繝域枚譖ク.lzh was not found on this server


無理です

No.19813 投稿時間:2005年11月10日(Thu) 17:43 投稿者名:通-行-人 URL:

> 上記をクリックすると、アドレス部分が「https://localhost/petition/CSsupport/upload/新規テキスト文書.lzh」となり以下のメッセージが表示されます。
> Not Found
> The requested URL /petition/CSsupport/upload/譁ー隕上ユ繧ュ繧ケ繝域枚譖ク.lzh was not found on this server

そもそも、 その CGI では無理でしょう。
HTTP の 302 ないし 303 応答で別の (CGI を経ない) ファイルへリダイレクトしているようですから、 文字セットの問題 (※) 以前に、 サーバのファイル名制限との競合が必ず発生します。
これは、 Reboot さんが説明されている通り。

漢字等のファイル名を指定したければ、 CGI は POST や GET に対し 200 応答を行い、 そのメッセージ本体を保存させる必要があるでしょう。
そのときレスポンスヘッダに Content-Disposition を追加しておき、 filename パラメータの値として Shift_JIS へ変換したファイル名を指定しておきます。

どーせ訪問者はみな Windows 機で、 みな日本語版で、 そしてブラウザもみな Internet Explorer でしょうから、 この方法で大多数の訪問者をカバーできます。
レスポンスヘッダに非 ASCII 文字をそのまま載せてしまうことになりますが。


(※)
多くのブラウザは漢字などをアドレスバーに投入したり、 HTML で直接記述しても動作しますが、 実際には Web サーバへ送られる前に文字の変換が掛けられます。

例えば 「新規テキスト文書.lzh」 を Web サーバに送るとき、

「%90V%8BK%83e%83L%83X%83g%95%B6%8F%91.lzh」
「%BF%B7%B5%AC%A5%C6%A5%AD%A5%B9%A5%C8%CA%B8%BD%F1.lzh」
「%1B$B%3F75,%F%-%9%HJ8%3Dq%1B(B.lzh」
「%E6%96%B0%E8%A6%8F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E6%96%87%E6%9B%B8.lzh」
「%u65B0%u898F%u30C6%u30AD%u30B9%u30C8%u6587%u66F8.lzh」

といった違いを生じ、 困ったことになります。
同一マシンの同一ブラウザでも、 環境や設定により動作が変わってしまいます。
CGI 側で自動判定の仕組みを組み込めば回避できるかもしれませんが、 上記のようなエンコード済み文字列を予めきちんと用意しておくのが正道でしょう。


少し話がずれますが。

No.19815 投稿時間:2005年11月10日(Thu) 20:49 投稿者名:Reboot URL:

今、アクセス解析CGIを色々試行錯誤して作っているのですが、検索サイト
からのリファラーを正確に読み取るのが一番苦労します。

jcode.pl でも、Jcode.pm でも、samaguni.pl でも不具合が出、
結局 perl5.8 の新機能 Encode.pm を使った Use Encode;
で処理するのが一番正確に読み取ってくれると分かりました。

Encode.pm にたどり着くまで、けっこうな日数を要しました。(^^;)


ファイル名をエンコードし、実行したら出来ました。

No.19824 投稿時間:2005年11月14日(Mon) 12:31 投稿者名:初心者 URL:

> > 上記をクリックすると、アドレス部分が「https://localhost/petition/CSsupport/upload/新規テキスト文書.lzh」となり以下のメッセージが表示されます。
> > Not Found
> > The requested URL /petition/CSsupport/upload/譁ー隕上ユ繧ュ繧ケ繝域枚譖ク.lzh was not found on this server
>
> そもそも、 その CGI では無理でしょう。
> HTTP の 302 ないし 303 応答で別の (CGI を経ない) ファイルへリダイレクトしているようですから、 文字セットの問題 (※) 以前に、 サーバのファイル名制限との競合が必ず発生します。
> これは、 Reboot さんが説明されている通り。
>
> 漢字等のファイル名を指定したければ、 CGI は POST や GET に対し 200 応答を行い、 そのメッセージ本体を保存させる必要があるでしょう。
> そのときレスポンスヘッダに Content-Disposition を追加しておき、 filename パラメータの値として Shift_JIS へ変換したファイル名を指定しておきます。
>
> どーせ訪問者はみな Windows 機で、 みな日本語版で、 そしてブラウザもみな Internet Explorer でしょうから、 この方法で大多数の訪問者をカバーできます。
> レスポンスヘッダに非 ASCII 文字をそのまま載せてしまうことになりますが。
>
>
> (※)
> 多くのブラウザは漢字などをアドレスバーに投入したり、 HTML で直接記述しても動作しますが、 実際には Web サーバへ送られる前に文字の変換が掛けられます。
>
> 例えば 「新規テキスト文書.lzh」 を Web サーバに送るとき、
>
> 「%90V%8BK%83e%83L%83X%83g%95%B6%8F%91.lzh」
> 「%BF%B7%B5%AC%A5%C6%A5%AD%A5%B9%A5%C8%CA%B8%BD%F1.lzh」
> 「%1B$B%3F75,%F%-%9%HJ8%3Dq%1B(B.lzh」
> 「%E6%96%B0%E8%A6%8F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E6%96%87%E6%9B%B8.lzh」
> 「%u65B0%u898F%u30C6%u30AD%u30B9%u30C8%u6587%u66F8.lzh」
>
> といった違いを生じ、 困ったことになります。
> 同一マシンの同一ブラウザでも、 環境や設定により動作が変わってしまいます。
> CGI 側で自動判定の仕組みを組み込めば回避できるかもしれませんが、 上記のようなエンコード済み文字列を予めきちんと用意しておくのが正道でしょう。

ありがとうございました。
ファイル名をエンコードし、実行したら出来ました。


目次掲示板過去ログ目次▲頁先頭