• ベストアンサー

Perlのcgi-lib.plでデコードされた文字をUTF-8にエンコ

Perlのcgi-lib.plでデコードされた文字をUTF-8にエンコードするにはどんなコードを書けば良いのでしょうか。 "あ"という文字をHTMLフォームから受取って%82%A0というS-JISのバイトコードに再エンコードするコードを質問したら $a = "あ"; $a =~ s/([^a-zA-Z0-9*\-.@_])/sprintf("%%%02X", ord($1))/eg; $a =~ s/%20/+/g; print $a; という答えを頂きました。コードの意味はよく判らなかったのですが、ちゃんと思惑通り$aは%82%A0になりますので長い間重宝にさせていただいています。 今度は$a="あ";の値をUTF-8の%E3%81%82にエンコードしたいのですが、どのように上記のコードを変更すればよいか教えてください。正規表現というのを使えば出来るのでしょうが、本で読んでもやっぱりわかりません。

  • CGI
  • 回答数2
  • ありがとう数15

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

  • ベストアンサー
回答No.2

> データの送信元のHTMLがUTF-8ならば、一旦cgi-lib.plで > デコードされた文字も私が使っているコードのままでUTF-8に > 再エンコードされるということでしょうか? そのとおりです。 ただ、例外としてformにaccept-charsetを指定するなど 送信する際の文字コードを別途指定した場合はそれに従います。 EncodeもCGIもこれまでのライブラリーと同じように使えるようにする書き方と オブジェクト指向っぽくする書き方の両方ができるのでいろいろと試してみると 面白いと思います。検索するとドキュメントもかなり豊富ですよ。

その他の回答 (1)

回答No.1

"あ"がUTF-8でエンコードされていたら何も考えずに同じコードで いけると思います。 つまり、ファイルをUTF-8で保存しておくとUTF-8が出力されます。 しかしながら、"あ"が何の文字コードで書かれていたとしてもUTF-8に 変換した上でURLエンコードする方法を教えた方がよいと思うので、 そのコード例を書いてみます。 以下、Perl 5.8以降でしか動作しませんが、5.8以降では標準となる 書き方だと思います。 use CGI; use Encode qw(from_to); use Encode::Guess qw/euc-jp shift-jis/; my $a = "あ"; from_to($a, 'shift-jis', 'utf-8'); # Shift-jisで書かれた"あ"をutf-8に変換 $a = CGI::escape($a); # $aをURLエンコードして$aに代入 print $a; from_toのところは文字列が不明で推測したいときは'shift-jis'の代わりに 'Guess'を使います。ただ、今回の'あ'のように文字列が短く、 判断が難しい場合は推測に失敗します。 ...昔ながらのPerlプログラマーはあまりライブラリを使いたがら なかったりしますが、ライブラリを使えるところはライブラリを 使った方が楽ですよ。

souta_n
質問者

お礼

まずはご回答ありがとうございます。 > "あ"がUTF-8でエンコードされていたら何も考えずに同じコードでいけると思います。 データの送信元のHTMLがUTF-8ならば、一旦cgi-lib.plでデコードされた文字も私が使っているコードのままでUTF-8に再エンコードされるということでしょうか? > しかしながら、"あ"が何の文字コードで書かれていたとしてもUTF-8に変換した上でURLエンコードする方法を教えた方がよいと思うので・・・ 教えていただいたコードを試してみたいと思います。もっとも私のパソコンの環境が古いのでセットアップしなおしからですが、いい機会です。重ねてお礼申し上げます。

関連するQ&A

  • Perl utf8上でshiftjisをデコード

    以下の環境にてURLエンコード(shiftjis)された文字を、UTF8として ブラウザに表示させたいのですが、上手く表示されません。 環境: サーバ:linux apache レンタルサーバ ※Encode.pm、Jcode.pm無し。追加モジュールインストール不可。 Perl version: 5.006001 ソースエンコード:utf-8 実行ソース: ------------------------------------ use utf8; require 'jacode.pl'; # $mojiに予めURLエンコードされた文字が格納されています。 # 例として「マウス」デコード前(%83%7D%83E%83X)とします。 #URLデコード $moji =~ s/%(..)/pack("c",hex($1))/ge;  #デコードされたsjis文字をUTF8へコンバート jcode::convert(\$moji, "utf8","sjis"); print ($moji); ----------------------------------- 例のように「マウス」と言う文字が$mojiに格納されている場合、 以下のような文字化けとなってしまいます。 ツマ燿セツス 正常にマウスと表示させるにはどうすればよろしいのでしょうか。 アドバイスを宜しくお願いします。

    • ベストアンサー
    • Perl
  • [Perl] unpackで不要文字にエンコード

    Perl CGIについてです。 文字列をエンコードしようと次のようにしてみました。 $val1 =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $val2 =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $va1は問題なくエンコードされ、デコードも元文字に戻ったのですが、 $va2のエンコード文字に不要な'25'が含まれるようになってしまいました。 例:「ガム」をエンコード >> %A5%AC%A5%E0  を期待していたのですが、結果は %25A5%25AC%25A5%25E0 と不要に'25'が含まれてしまいました。unpackの文が悪いのでしょうか?ご教示ください。

    • ベストアンサー
    • CGI
  • utf-8の文字列に対してURLエンコードを行なうには?

    最近 perlをutf-8で書き始めたのですが、文字コードではまっています。 cgiの内部から別のcgiへpostで全角文字を送る場合 URLエンコードしてから送ると思うのですが 文字コードがutf-8の時、どのようにURLエンコードしたら 良いのか分からず困っています。どなたかご存知でしょうか? ちなみに文字を受ける方のcgiでは以下の様にURLデコードしています。 $data =~ tr/+/ /; $data =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; 試用しているperlのバージョンはperl5.8です、よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perlの文字コード変換についての質問です。

    Perlの文字コード変換についての質問です。 ホームページ全体は、UTF-8で作成されています。 そのため、$qsは、どうも、S-JISのようなので、UTF-8に変換して URLデコードさせたいのですがうまくいきません。 文字化けしないで、UTF-8で作成されたページに表示させたいのですがどうすればよいでしょうか? 宜しくお願い致します。 ------------------------------------ $qs = $ENV{'QUERY_STRING'}; use Encode::Guess qw/ shiftjis /; use Encode qw/ decode /; $enc = guess_encoding ( $qs ); if ( ref $enc ) { $utf8 = decode ( $enc->name , $qs ); } $qs =~ tr/+/ /; $qs =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; print "$qs";

    • ベストアンサー
    • Perl
  • UTF-16のデコード方法

    いつもお世話になっております。 Perlにて、以下のUTF-16の文字コードをデコードしたいのですが、 どのように記述すればデコード出来るのでしょうか? ※PerlのVerは5.8です。 (文字コード) %u4f11%u6b62%u30fb%u89e3%u7d04%u30fb%u5fa9%u6d3b よろしくお願い致します。

  • CGIでのフォームのデコードについて

    お世話になります。 formで検索結果を表示する際にワードが文字化けしてしまうのでご相談です。 フォームにキーワードをいれ、その結果を返すというページを作成しているのですが、 <form action="search.cgi" method="get">といった形で、GETを利用し検索フォームを作成する際に、URLエンコードはうまくいくのですが、検索キーワードが文字化けをしていまします。 例)イチゴを検索してみると、 URL http://アドレス/search.cgi?mode=meta&t_mode=meta_page&ie=Shift_JIS&oe=Shift_JIS&word=%83C%83%60%83S&hl=ja 検索キーワード 検索結果が「繧、繝√ざ」と表示されてしまう。 そのため検索結果が0となる。 エンコードはうまくいっているが、デコードが不具合を起こしているようなのですが… sub url_decode($) { my $str = shift; $str =~ tr/+/ /; $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; return $str; } どう修正したらよいのかご教授いただけると幸いです。よろしくお願いします。 (文字コードは今回はShift_JISを利用することを前提としています。)

    • 締切済み
    • CGI
  • 文字列は大文字のまま、UTF-8エンコードの英字だけ小文字にしたい

    下記の方法でUTF-8エンコードをしたときに、 コードの英字が大文字になってしまい困っています。 use Encode; $str = "HOGEホゲ" $str =~ s/(\W)/'%' . unpack("H2", $1)/eg; print "$str"; 現状のエンコード後)HOGE%E3%83%9B%E3%82%B2 希望のエンコード後)HOGE%e3%83%9b%e3%82%b2 半角英数字(HOGE)は大文字のままで、 エンコードだけを小文字で書き出す簡単な方法はありますでしょうか。 (小文字でないと受け付けてくれないサイトに飛ばしたいため) 現状は正規表現でAからZまで26行繰り返しています。 $str =~s/\%([A-Z0-9]{1})?A/%$1a/g; ~ $str =~s/\%([A-Z0-9]{1})?Z/%$1z/g; よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 特殊な文字列のデコードについて

    ご教授願います。 迷惑メールなどに多いのですが、下記の様に記述されている文字列があります。 ↓↓↓↓↓↓ =1B$B"(%a!<%k1\MwL5NA"(=1B(B 上記の文字列をフリーウェアの「MBaker2」でデコードすると ↓↓↓↓↓↓ ※メール閲覧無料※ の様に、読める形の文字列に変換されます。 こうした形で意図的にエンコード(?)された文字列をPHPを使ってデコードするにはどうしたら良いのでしょうか? メールクライアントのOutlook Express6等でも読めるので、一定の法則に則って変換されていると思うのですが、そのアルゴリズム(?)が判りません。 PHPのマニュアルを調べてデコード系の関数を色々と試してみましたが、どうにも上手く行きません。 前述の「MBaker2」のヘルプから、HTML特有の制御文字列と漢字コードが関係している所までは判ったのですが、ココで壁にぶつかってしまいました。 PHPで人が読める形にPHPで処理するにはどうしたら良いのでしょうか? 宜しくお願いします。 P.S PHPのバージョンは 5.2.6 を使い、PHPでの入出力は、UTF-8で統一しています。

    • ベストアンサー
    • PHP
  • URLデコードした文字列からURLエンコード

    よろしくおねがいします。 質問掲示板の中にある検索で質問掲示板の中身を検索した時に、同時にGoogleでも検索しようとおもっています 初めにフォームから得られたクエリーをデコードして &jcode'convert(*val, 'sjis'); に変換しました。 これで得た文字列で質問掲示板の中身を検索します。 つぎに、この文字列をエンコードしてGoogleに渡そうと思いましたが、ここでつまずいてしまいました。 &jcode'convert(*sarchword,'euc','sjis'); #---------- $sarchword =~ s/([^\w ])/'%' . unpack('H2', $1)/eg; $sarchword =~ s/(\W)/'%'.unpack("H2", $1)/ego; #---------- #↑このどちらかを行ってから $sarchword =~ tr/ /+/; これでできると検索して出てきたのですが、それでも正しい結果を得ることができず、文字コードの変換も'euc'を'sjis'等といろいろ変換してみてもできずに困っています。エンコードした結果の文字コードがまったく別のコードになってしまうみたいなのです。 たとえば「あいうえお」と検索したときに、上の方法でエンコードすると「%a4%a2%a4%a4%a4%a6%a4%a8%a4%aa」という値になります。 正しい結果を得る方法を教えていただけないでしょうか。 意味がわかりませんでしたら、再度説明いたしますのでよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • perl cgi のエンコード SHIFT->UTF-8

    こんにちは初心者です。 現在、既存のperl cgiをカスタマイズしております。 エンコードをshift_jisからUTF8に変更したいのですが、表示はCGI自体をUTF-8に変更し普通に見ることができるのですが、書き込みをしようとすると文字化けがおこります。 jcode.plをjcode.pmに変換すればよいらしいまでは分かったのですが、どこをどう変換すればいいのかjcode.pmのサイトを見ても理解できません。簡単な説明サイト紹介やアドバイス等をいただけませんでしょうか?

    • 締切済み
    • CGI

専門家に質問してみよう