IEでのURIエンコーディングに関するトラブル

このQ&Aのポイント
  • 現在CGIプログラム(Perlプログラム)を作成し、HTMLのFORMで日本語テキスト(Shift_JIS)を入力させ、CGIにクエリとしてそれを受け渡しています。
  • テキストとして「貴社の記者」をURIエンコーディングさせると、「貴」は8B4D、「社」は8ED0、「の」は82CC、「記」は8B4C、「者」は8ED2(全てShift_JIS)なので、%8B%4D%8E%D0%82%CC%8B%4C%8E%D2 とエンコードされると思います。
  • しかし、実際Internet Explorerでクエリを送信してみると、%8BM%8E%D0%82%CC%8BL%8E%D2 というクエリが送信されているようです。URIエンコードは%の次は2桁の16進数が来ると聞いているので、今回の文字列に3桁、しかも、最後の桁の文字は16進数ではないのか分かりません。
回答を見る
  • ベストアンサー

IEでのURIエンコーディングに関するトラブル

現在CGIプログラム(Perlプログラム)を作成しています。 そのプログラムではHTMLのFORMで日本語テキスト(Shift_JIS)を入力させ、CGIにクエリとしてそれを受け渡します。 例えば、テキストとして「貴社の記者」をURIエンコーディングさせると、「貴」は8B4D、「社」は8ED0、「の」は82CC、「記」は8B4C、「者」は8ED2(全てShift_JIS)なので、 %8B%4D%8E%D0%82%CC%8B%4C%8E%D2 とエンコードされると思います。 しかし、実際Internet Explorerでクエリを送信してみると、 %8BM%8E%D0%82%CC%8BL%8E%D2 というクエリが送信されているようです。 URIエンコードは%の次は2桁の16進数が来ると聞いているので、今回の文字列に3桁、しかも、最後の桁の文字は16進数ではないのか分かりません。 ・プログラム部分 $query = $ENV{'QUERY_STRING'}; @pairs = split(/&/, $query); foreach (@pairs) { ($name,$value) = split(/=/); $in{$name} = $value; } $u = $in{'sentence'}; $u =~ tr/[a-f]/[A-F]/; $u =~ tr/+/ /; $u =~ s/%([A-F0-9]{2})%([A-F0-9]{2})/&decodechar($1 . $2)/eg; の様な形で、「貴」だったら「%8B%4D(%8BM)」のクエリから「8B4D」を、「社」だったら「%8E%D0」のクエリから「8EDO」を文字列として取り出したいと思っています。 # 最後にdecodechar関数を使用していますが、直接テストをした際は問題なく動いているので、その部分にバグはないようです。 Shift_JISの日本語文字列をURIエンコーディングしたときに、なぜこの現象が起こるのか、また、この現象が起きたときの対策を誰かご存じの方いらっしゃいますでしょうか? よろしくお願いします。

  • Zawaja
  • お礼率85% (135/157)
  • Perl
  • 回答数1
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • jun2004
  • ベストアンサー率42% (24/57)
回答No.1

%8B M = 0x4d %8E %D0 %82 %CC %8B L = 0x4c %8E %D2 3桁ではなくコードが文字になっています。 ASCIIコード表と見比べてみると分かります。

Zawaja
質問者

お礼

質問後素早い回答ありがとうございました。 おかげで解決致しました。

Zawaja
質問者

補足

この回答を他の方が参考に出来るよう補足しておくと -------------------- $char = "M"; $ret = "%" . unpack("H2",$char); print "$ret"; -------------------- で「%4d」と変更することが出来ました。 あとは -------------------- uc($ret); print "$ret"; -------------------- とすれば「%4D」と出力することが出来そうですね。

関連するQ&A

  • RubyでのUnicode→sjis

    Rubyで、 「\u3053\u3093\u306B\u3061\u306F 」のようなエンコーディングされた文字を、 「あいうえお」とShift-JISで表示するにはどうすればいいのでしょうか JavaScriptでは、 unescapeで一発なんですけど…

    • ベストアンサー
    • Ruby
  • 英文字を含む文字列のURIエンコードについて

    宜しくお願いいたします。 以下のサイトでHTMLソースの一部をURIエンコードして、javascriptでデコード・書き戻して利用する方法についての記述を見つけました。 http://ameblo.jp/azuki-milk-lush/entry-10559249105.html このページには、以下のようにエンコードされている事例が掲載されています。 document.write('<a href="mailto:メールアドレス">お問い合わせ</a>'); ↓ %64%6F%63%75%6D%65%6E%74%2E%77%72%69%74%65%28%27%3C%61%20%68%72%65%66%3D%22%6D%61%69%6C%74%6F%3A%73%75%70%70%6F%72%74%40%73%74%61%2D%6C%6F%67%2E%63%6F%6D%22%3E%E3%81%8A%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%3C%2F%61%3E%27%29%3B 上記では一見アルファベットも識別できないような形でエンコードされています。 早速このページで紹介されている変換サービスサイトで、実験をしてみたのですが、同じような結果にはなりません。 http://itsd210.s24.xrea.com/ja/urlencode/ 【▼こうなってしまう▼】 document.write('<a href="mailto:メールアドレス">お問い合わせ</a>'); ↓ document.write('%3Ca%20href%3D%22mailto%3A%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%22%3E%E3%81%8A%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%3C%2Fa%3E')%3B 一見してアルファベットも識別できないような変換はどのようにすれば行えるのでしょうか? 詳しい方がいらっしゃいましたら、ご教示願います。 何卒、宜しくお願い申し上げます。

    • ベストアンサー
    • HTML
  • 1バイトのみのテキストのエンコーディング

    「Googleサイトマップ」用にテキスト形式のサイトマップファイルをアップロードしたところ、文頭に何か2バイト付加されてエラーになりました。 MAC OS9でJedit3からUTF-8/LFで保存したもので、サイトのURLを羅列しただけの内容です。 WINDOWSのK2EditorでUTF-8Nにして再送信しましたが、まだGoogleが確認していません。 そこで大変基本的(初歩的)な疑問ですが、1バイトASCII文字のみのテキストファイルをUTF-8エンコーディングで保存して再度開くとエンコーディングはどうなるのでしょうか? 改行コード(CR/LF)はShift-JISと同じ(0D/0A)なのでしょうか。そうだとすると保存するときの「漢字コード」がShift-JISでもUTF-8でも2バイト文字を含まない場合は結果(ファイルの内容)は同じになるのでしょうか? テキストファイルの内容(漢字コードや制御文字)を見るツールなんてものがあるのでしょうか。

  • シフトJIS の1バイト目

    シフトJISの1バイト目は 0x81~0x9F と 0xE0~0xEF というサイトもある。 0x81~0x9F と 0xE0~0xFC というサイトもある。 最近、文字コードに追加か削除された文字があるから 意見が2つに分かれていると思うんだけど、 現在はどうなのか教えてください。 シフトJISの2バイト目は 0x40~0x7E と 0x80~0xFC ですか? http://google.yahoo.co.jp/bin/query?p=%a5%b7%a5%d5%a5%c8JIS+9F+E0+81&hc=0&hs=0 を参考にしました。

    • 締切済み
    • CGI
  • DBI、joinsした時の、出力構造について

    先日、 joinした際、同じidのものは 纏まってくれたらハッピーだと考えました。 あれそれ動かしてきたのですが、出力結果でゴニョゴニョ行うのではなく、 一発で 目的の出力結果にならないものでしょうか。 よろしくお願いします。 テーブル1 a___b___c_ 1___BB__CC 2___BB__CC 3___BB__CC テーブル2 d___e___f D___E___1 D___E___2 D___E___2 結合テーブル a___b___c___d___e___f 1___BB__CC__DD__EE__1 2___BB__CC__DD__EE__2 2___BB__CC__DD__EE__2 3___BB__CC__ 出力結果 $VAR1_=_[ __________{ ____________'a'_=>_1, ____________'b'_=>_BB, ____________'c'_=>_CC, ____________'d'_=>_DD, ____________'e'_=>_EE, ____________'f'_=>_1, __________}, ____________[ ______________{ ________________'a'_=>_2, ________________'b'_=>_BB, ________________'c'_=>_CC, ________________'d'_=>_DD, ________________'e'_=>_EE, ________________'f'_=>_2, ______________}, ______________{ ________________'a'_=>_2, ________________'b'_=>_BB, ________________'c'_=>_CC, ________________'d'_=>_DD, ________________'e'_=>_EE, ________________'f'_=>_2, ______________}, ____________] __________,{ ____________'a'_=>_1, ____________'b'_=>_BB, ____________'c'_=>_CC, ____________'d'_=>_, ____________'e'_=>_, ____________'f'_=>_, ___________}, よろしくお願いします。

    • ベストアンサー
    • Perl
  • エクセルのセルに入れた文字あるいは数字を別なセルに1文字づつ、「右詰」で移したい

    以前に エクセルのセルに入れた文字あるいは数字を別なセルに1文字づつ移したい、ということで質問しまして、「MID関数を利用する」事で、先頭文字から一文字ずつ別々なセルに移すことが出来ましたが、スミマセンが次のような場合はどのような関数になるのでしょうか? 例えば「番地などの表示」等で1桁の場合もあれば、5桁あるいは6桁等々の場合もあるとします。これを別なセルに下一桁を合せる様にしたいのです。 例としまして セルA1に1桁~6桁の数字(例:345678)を入力した場合、これを右側のB1には3を、同様にC1には4を、D1=5、E1=6、F1=7、G1=8を関数で入力できるようにしたい。 問題は、桁数が毎回違う場合にG1に下一桁が来るようにしたいのですがRIGHT関数では下一桁だけ応答されるのは上手くいくのですが、下二桁、三桁以上の場合には上手くいきません。 つまり「A1に789」の数字を入力したら、G1=9が、F1=8が、E1=7が応答されるようにしたいのです。 勿論、5桁の場合にはB1が空欄で、C1、D1、E1、F1、G1が埋まる様に、4桁であればB1とC1が空欄で、D1~G1が埋まるように、三桁の場合にはB1~D1が空欄でE1~G1が埋まるようにですが、出来ますでしょうか?? よろしくご教授お願いします。

  • 文字コードでについて

    いつもお世話になっております。 以下の文字が、何の文字コードのエンコードか分かりません。 ご存知の方がいらっしゃれば教えて頂けますでしょうか? (文字) %u4f11%u6b62%u30fb%u89e3%u7d04%u30fb%u5fa9%u6d3b

    • ベストアンサー
    • Perl
  • 文字列を大文字の2桁ごとのコンマ付き16進数に変換する方法

    文字列を大文字の2桁ごとのコンマ付き16進数に変換する方法がわかりません。ただ単に文字列を16進数に変更するだけならbin2hex()でできますけど、誰か知っている方はいませんか?具体的には、変換された文字列が1a2b3c4d5e6fなら、1A.2B.3C.4D.5E.6Fと変換したいんです。どうすればいいですか?

    • ベストアンサー
    • PHP
  • IEを直したいのです。

    ご指導宜しくお願い致します。IEが故障してしまいInternet Explorer 6 Service Pack 1をインストールしましたがInternet Explorer 6をクリックすると・・・ (このプログラムは不正な処理を行ったので強制終了されます。終了しない場合は、プログラムの製造元に連絡してください。)とコメントがでます。 詳細は(EXPLORER の一般保護違反です。 モジュール : V128IID.DRV、アドレス : 0002:0000b6d6 Registers: EAX=00000000 CS=0337 EIP=0000b6d6 EFLGS=00000216 EBX=0000001e SS=649f ESP=00007fba EBP=00007fdc ECX=00000009 DS=6b17 ESI=00000292 FS=0000 EDX=00000022 ES=20d7 EDI=005aaf40 GS=0357 Bytes at CS:EIP: 67 0f 6f 46 08 66 83 c6 10 67 26 0f 7f 0f 67 26 Stack dump: 00002ea2 00000001 00000044 89af0000 00000440 0000001e 00000011 00000000 80160637 045f4cec 6b170050 00000264 00000001 6a870000 00002ea2 00000050 )と出ています。 修復も試したし再インストールも試しました。 太鼓がトントン叩かれて正常にインストールされたのですがダメなんです。 何故でしょうか・・・・ 宜しくお願いします。 現在はネットスケープ7.1で凌いでおります。

  • 新しい(?)スケールの理論的解説をお願いします

    耳を頼りにフレーズを作り、あとで分析してみると、自分の知らない(一応色々なモードも当てはまるか見てみたのですが)スケールを使っていました。スケールディグリーは、1 ♭2 ♭3 ♭4 5 ♭6 ♭7 8。keyがBのときB C D ♭E ♯F G A Bとなります。これでコードを作ると、Bm7 CmM7 D7 E♭M7(#5) F#dim7 GM7 Am7(♭5)となるので、Bm7を鳴らしてこのスケールを弾いてみました。ちょっと危うい音もありますが、私はこういうのもありだなぁとか思っているのですが、これは理論的に大丈夫なのでしょうか?♭4はメジャー3度とも取れるのでやはりm7上ではまずいでしょうか?

専門家に質問してみよう