CGI.pmで日本語をURLエンコードするとおかしくなります。
print($q->unescape($q->escape('あ')), "\n");
このコードは文字'あ'をURLエンコードしたものをURLデコードして表示するはずです。
すなわち'あ'と表示するはずです。
しかし実際には'a??'と表示されてしまいます・・・
何か他の関数をかまさないといけないのでしょうか???

このQ&Aに関連する最新のQ&A

A 回答 (1件)

私の環境では、 utf8 や encoding を use してる場合に単純にはできませんね。



下記は、スクリプトを UTF-8 で書いて STDOUT のコードを Windows の SJIS にする例で、正しく動作します。 CGI.pm 3.15 は utf8フラグに対応してない模様です。

#! /usr/bin/perl -w
useEncode;
useutf8;
useCGI;
binmode(STDOUT, 'encoding(Windows-31J)');
my$esc= CGI::escape('あ');
print("$esc=", decode('utf8', CGI::unescape($esc)), "\n");


再度質問される場合は、上の例の様に問題を確認できるなるべく短いスクリプト全体を書いて頂ければ解決が早いかも知れません。
    • good
    • 0
この回答へのお礼

zxcv0000さん、ご回答ありがとうございます。
ご紹介いただいた見本コードを参考に、なんとか日本語でもまともにURLエンコードできるようになりました。
しかし私は
>CGI.pm 3.15 は utf8フラグに対応してない模様です。
とのコメントが気になり、試しにCGI.pmを最新版にしてみました。
そうしたら、Encode.pmに頼らなくても日本語のURLエンコード(デコード)ができるようになっていました!!

print($q->unescape($q->escape('あ')), "\n");
このコードを実行すると'あ'と表示されるようになりました
\(^o^)/

お礼日時:2009/05/17 21:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCGIを使っていないページを.htaccessでアクセス制御

こんにちは。質問させて頂きます。
不正アクセスをした人を制限する為に.htaccessを使いたいと思っています。
それで.htaccessは掲示板などのCGIではないページ、つまり○○.htmlなどのディレクトリにおく事は可能なのでしょうか?(htmiファイルに対して制限を掛ける事が可能?)


そして記述は


<Limit GET>
order allow,deny
allow from all
deny from ●●●.domain.com
deny from 209.15.00.00
</Limit>
<Files ".*">
deny from all
</Files>

これでいいのでしょうか?ホストとIPがわかっている場合はその両方を続けて記述してもOKなのでしょうか?

それとファイル名なのですが、.htaccessだけでいいのでしょうか?
○○.htaccessみたいに任意の名前を付けられないのでしょうか。

転送はアスキーモードとくぃう事ですが、普通のHTMLファイルと同じって事なのでしょうか?そもそも.htaccessはCGIとは違うので、cgiのディレクトリにいれなくてもいいんですよね?Parlのパスも記述しなくていいみたいですし。

疑問点が多いので申し訳ないのですが、どうか宜しくお願い致します。

こんにちは。質問させて頂きます。
不正アクセスをした人を制限する為に.htaccessを使いたいと思っています。
それで.htaccessは掲示板などのCGIではないページ、つまり○○.htmlなどのディレクトリにおく事は可能なのでしょうか?(htmiファイルに対して制限を掛ける事が可能?)


そして記述は


<Limit GET>
order allow,deny
allow from all
deny from ●●●.domain.com
deny from 209.15.00.00
</Limit>
<Files ".*">
deny from all
</Files>

これでいいのでしょうか?ホストとIPがわかってい...続きを読む

Aベストアンサー

.htaccessは、それがあるディレクトリ(=フォルダ)に対してはたらきます。HTMLや、画像ファイルなどどんなファイルに対しても使えます。

そもそも、CGIとは別の機能です。サーバー自体がサポートしていますので、どんなディレクトリでも働きます。

ちなみに、ファイル名は、.htaccessと決まっていますので、○○.htaccessというわけには行きません。
もしも、パソコン上でこの名前のファイルが作れないのなら、適当にhtaccess.txtファイルを作って転送して、サーバー上で名前を変更すればいいです。


普通のHTMLファイルと同じ転送でかまいません。




htaccessは使えない場合も多いので使っているサーバーに確認をしたほうが良いと思います。

Q$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );がよく

$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );

というスクリプトがあったのですが、

$wfurikae = 1 の後に;もいれずifがきています。

違和感があります。

どのような意味になるのでしょうか。

宜しくお願い致します。

Aベストアンサー

そのまんまだと思いますよ。
if 以下の条件が真の時 $wfurikae = 1となります。
Perlはいろいろな書き方ができますので、こういう書き方もありです。
英語の文法の並びにする書き方です。

Qcgi-bin内に.htaccess

現在MacOSXでwebサーバーを構築しているのですが,cgiファイルを置いているcgi-bin内に,
.htaccessファイルを置いてアクセス制限を行いたいのですが,これはどのようにしたら良いでしょうか?

現在webページの一部に.htaccessを用いてアクセス制限を行い.そこからcgiにリンクさせているのですが,
cgiのアドレスを直で入力するとアクセスできてしまいます.
よろしくお願いします.

Aベストアンサー

OS-Xはいじったことありませんが、、

httpdはApacheですよね?
(たしか標準かオプションでApacheが入るはずと思ったが、或いは自分で入れたか)
ならばhttpd.conf内の該当ディレクトリコンテナのAllowOverride の記述を変えます

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" <=ここに記述されたのと同じディレクトリーコンテナに

<Directory "/var/www/cgi-bin">
AllowOverride AuthConfig Limit
 #       つまり↑ここが最初Noneの筈なので、このように書き換える

http://httpd.apache.org/docs/2.0/ja/mod/core.html#allowoverride
cgi-bin内で制限するなら 普通は .htaccessを有効にせずに
httpd.confに直接書く方が多いんじゃないかと思います。

QPrel正規表現で'$1$'.$saltのあたりが理解できない。

小生Perlを勉強中です。
Perl Codeに以下のようなパスワード暗号処理のサブルーチンが
ありましたが、読めません。教えて下さい。

sub encrypt{
local($inpw)=$_[0];
local(@SALT,$salt,$encrypt);

@SALT=('a'..'z','A'..'Z','0'..'9','.','\');
srand;
$salt=$SALT[int(rand(@SALT)).$SALT[int(rand(@SALT))];
$encrypt=crypt($inpw,$salt)||crypt($inpw,'$1$'.$salt);
return $encrypt;
}

とあります。
特に、下から3行目の($inpw,'$1$'.$salt)が
理解できません。
解説していただければ幸いです。

Aベストアンサー

過去に同様の質問がありました。ctpsysさんの疑問にすべて答えられるかどうかわかりませんが、すくなくとも
>下から3行目の($inpw,'$1$'.$salt)が理解できません
というご質問に対しては参考になるかと思います。

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=74593,http://oshiete1.goo.ne.jp/kotaeru.php3?q=74593,

Q.htaccessの中身が php5 CGI版で動かない

拡張子htmlファイルをphpファイルと認識させる為に、

.htaccessで

AddType application/x-httpd-php .html
AddHandler x-httpd-php .html


と書いて対応していました。


今まではサーバーのphpのバージョンがPHP4(DSO版)だったのですが、昨日サーバーのバージョンがPHP5(CGI版)になってから、上記のような.htaccessが機能しなくなってしまいました。

order deny,allow
deny from all

これはちゃんと動くので、.htaccess自体が拒否されてるみたいなことはないと思います。

AddType application/x-httpd-php .html
AddHandler x-httpd-php .html

このプログラムがPHP5 CGI版にて意図した動作とならないのです。

何か分かる方いらっしゃいましたら、宜しくお願い致します。

Aベストアンサー

同時期に同じバージョン変更なので、多分同じサーバを使っています。
ファーストサーバでしょうか?
であれば以下をご参考ください。違ったら無視でお願いします。
また、CGI版が使いたいとのことであれば解決にはなっていませんので無視を。

サーバ設定のコンフィグレータ→PHPインストール といくと、
DSO版のPHP5へ切り替えができます。
切り替えれば今までどおり、↓は使えます。
AddType application/x-httpd-php .html
AddHandler x-httpd-php .html

Q@×× = $q->param('**'); の書き出しについて

このようなチェックボックスを作って
<INPUT type="checkbox" name="q1" value="A">A<br>
<INPUT type="checkbox" name="q1" value="B">B<br>
<INPUT type="checkbox" name="q1" value="C">C<br>

このようなPerlの記述をして
use CGI;
$q = new CGI;
@q1 = $q->param('q1');

このようなCGIの値の書き出し部分はどうしたらいいですか?
print "<td width=300><font size=2>●●{'q2'}</font></td>\n";

上記の
@q1 = $q->param('q1');
に、チェックされた値が格納されているんですよね。
その値を表示させたいと思っています。
いろいろ教えてもらって、ここまでたどり着きました。

Aベストアンサー

#3さんの『お礼』にあるコードですが、間違っているところだけ書いておきます。

原因はCGI.pmと独自の入力処理が、それぞれデータをとり合っていることです。このコード上では、独自の入力処理の部分がSTDINを読み込んでしまうので、CGI.pmからは何も読む事は出来ません。

入力処理には、CGI.pmか独自入力処理の『いずれか』を用いてください。全て書いても使えるのは一つだけです。質問内容から考えられるお勧めは、CGI.pmを利用する事です。(オーバースペックですが、ひとまずそう言うことは考えない方針で。)

コードを見る限り、恐らく『データでコード処理』の部分を全て削除すれば大丈夫だと思います。

Q.htaccessを用いて.cgiを.htmlにリダイレクトしたい

.htaccessを用いて.cgiを.htmlにリダイレクトしたい

現在webサイトで以下のようなURLが表示される掲示板を設置しています。

http://hoge.com/bbs1/bbs.cgi?nd=dd&parent=32
http://hoge.com/bbs1/bbs.cgi?nd=dd&parent=500

(最後の数字は10から500くらいまであります)

これを過去ログにするため、html化しました。
http://hoge.com/log1/32.html
http://hoge.com/log1/500.html


しかし以下のような.htaccessを、/bbs1/以下に設置しても、htmlに転送することができません。

RedirectPermanent /bbs1/bbs.cgi?nd=dd&parent=32 "http://hoge.com/log1/32.html"

ちなみに以下のようなhtmlファイル同士の転送はできます。

RedirectPermanent /bbs1/index.html "http://hoge.com/log1/index.html"

301リダイレクトでcgiをhtmlに転送することはできないのでしょうか?
もしおわかりになりましたらご教授いただけますと大変有り難いです。

.htaccessを用いて.cgiを.htmlにリダイレクトしたい

現在webサイトで以下のようなURLが表示される掲示板を設置しています。

http://hoge.com/bbs1/bbs.cgi?nd=dd&parent=32
http://hoge.com/bbs1/bbs.cgi?nd=dd&parent=500

(最後の数字は10から500くらいまであります)

これを過去ログにするため、html化しました。
http://hoge.com/log1/32.html
http://hoge.com/log1/500.html


しかし以下のような.htaccessを、/bbs1/以下に設置しても、htmlに転送することができません。

RedirectPermanent /bbs1/bbs.c...続きを読む

Aベストアンサー

?付けるとquery消えます。

RewriteEngine on
RewriteCond %{QUERY_STRING} ^nd=dd&parent=([0-9]+)$
RewriteRule ^bbs.cgi$ /log1/%1.html? [R=301,L]




http://xn--u8jxb9ib9150b2px.jp/htaccess/rewritequery2.html

Q$in{'~'}を$~に変換

CGIを改造中です。
変数の処理なのですが、サブルーチン内で利用するときに「$in{'~'}」と言う形でしか表示してくれません。これを「$~」の形にしたいです。
数が少なければ「$~ = $in{'~'}」を個数書けばいいのでしょうけど、結構数があるので、何か簡単な方法で変換できないかと考えています。
良い方法があれば教えてください。

Aベストアンサー

ハッシュのままで何か不都合があるのかなと
疑問に思いつつ・・・
#実際ハッシュは
#「(変数の)値に別の値を対応させる」
#ために存在するわけだから

けど,まあ,やろうと思えばkeys関数でできますよ.

%in=(
'X' => 1,
'Y' => 2,
'Z' => 3,
);

for $key (keys %in){
${$key}=$in{"$key"};
print "key; $key ${$key}\n";
}

print "$X $Y $Z";

strictとwarningsのプラグマを外さないといけないので
副作用の方が大きいでしょうが.

Q.htaccess で一部の.cgiをアクセス禁止にしたいです。

.htaccess で一部の.cgiをアクセス禁止にしたいです。

.cgi は、アクセス可能のまま
.cgi? の付く?以降でのアクセスを禁止に出来ますか?
無理なら特定の aaa.cgi は可能で、aaa.cgi? 以降を不可能に出来ますか?
例えば、aaa.cgi?_answer などの aaa.cgi? 以降をアクセス禁止にしたいです。
answerの部分は無限にあります。
下記では .cgi 自体もアクセスできなくなってしまうのです。。。

<FilesMatch "\.cgi?">
order deny,allow
deny from all
</FilesMatch>

Aベストアンサー

http://www.yuzuriha.sakura.ne.jp/~akikan/kaigai/kaigai6.html
これ役に立つかな

Q@color1 = ('0000ae',・・・,'$user_color')で・・

とまとです。

行き詰まりました(TェT)

標題の代入で、'$user_color'の部分を文字列ではなく、後から出て来るinputで入力した文字を代入させるにはどうしたらいいのでしょう?
※標題のままだと「$user_color」という"文字列"が代入されてしまいます。

Aベストアンサー

変数の内容を展開したければ、
' でくくらなければいいわけですが、
後から出てくるなら、その代入時点では
undefine 状態ですか?


人気Q&Aランキング

おすすめ情報