このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

%に続くコードの変換(漢字コードへの変換)

発言者:池田篤司
( Date Friday, October 11, 1996 09:59:36 )


池田です、こんにちは。

最近、MacPerlを使ってCGIの勉強をはじめた初心者です。
いきなり質問をして申し訳ありません。しかし、いくつかのドキュメント等を
探してもわからなかったので、宜しくお願いします。
Webのサーバーは,MacHTTPです。

[質問]
From文のMETHODにPOSTを指定して、漢字コードをCGIプログラムに渡したいのですが
MacHTTPから渡される %xxx (xxxは英数字)と言うコードは、どうやって元の漢字に戻すことが出来るのでしょうか?
NCSAのHTTPDは、%のあとに2桁の16進数が渡されてきているようなのですが、MacHTTPは違うのでしょうか?
また、これを変換するPerlのライブラリはでているのでしょうか?

よろしくお願いします。

田中求之 さんからのコメント
( Friday, October 11, 1996 14:38:19 )

Perl については、私は知りませんので、他の方にフォローしてもらうとして、
POST Arg の %XX ですが、これは、どんなサーバーの場合でも、 XX が
HEX による ASCII Code になっています。ですから、 %20 であればスペース
に戻すというように、%XX のパターンはデコードしていきます。

アルファベットと一部の記号は変換されずに送られてきます。このため、日本語
(2バイト文字)のデータは %XX とアルファベットが入り交じった形になり
ます( %XX へのエンコードは1バイト単位で行われるため)。


池田篤司 さんからのコメント
( Monday, October 14, 1996 14:48:52 )

早速の回答どうもありがとうございます。

どうも私の勉強不足だったようです。

サーバーから送られてきたデータが

  %92r%93c%93%C4%8Ei 

と言うデータでした。
これは、"池田篤司"がコードに変換されて送られてきたのですが
%92rと頭にあったので、私は、これは16進数ではないと思っいました。
田中さんに言われたとうりに、%のマークから2桁分を16進数とみなして
(上の例の場合、%92rのrは無視しました)コード変換をしたら無事変換
が出来ました。

ちなみに、Perlのコードは以下のようになりました。

-----
 read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/,$buf);
while (@pairs) {
  $pair=shift @pairs;
  ($name,  $val) = split(/=/, $pair);  
  $val =~ tr/+/ /;
 → $name =~ s/%(..)/pack("C", hex($1))/eg;
 → $val =~ s/%(..)/pack("C", hex($1))/eg;
  $form{$name} = $val;
   print "$name=$form{$name}\n ";
}
---------
以上の用にしてサーバーから渡されたデータを
もとの漢字データに変換することが出来ました。
”→”のついている個所が%xxを16進数とみなして
処理をしているところです。

田中さん、親切な解説ありがとうございました。

田中求之 さんからのコメント
( Monday, October 14, 1996 17:41:12 )

お役に立って何よりです。

日本語(2バイト文字)が、1バイト毎に分けられた上でエンコードされるのだというのに
気が付かないと、池田さんが最初に思われたように、間に混じっているアルファベットにも
何らかの処理が必要なのではないかと思ってしまうというのはありますよね。

普段から文字化けに慣れていると、こういう時に、すぐに気が付くんですが (^_^;;