• ベストアンサー

特殊な文字列のデコードについて

bincookの回答

  • ベストアンサー
  • bincook
  • ベストアンサー率50% (1/2)
回答No.3

No.1で回答した者です。 > 何故"$"や"%"等の記号が乱入して来る $や%は表示可能文字だからです。 No.1で参考URLとして記載したページを見ていただくとわかりますが、「=」やTABや空白などはエンコードされますが、表示可能文字はそのままです。 今回のデータでは、 「=1B$B"(%a!<%k1\MwL5NA"(=1B(B」 のうち、 最初に登場する「=1B」と後ろに登場する「=1B」がエンコードされた部分です。 元のデータは「iso-2022-jp」ですから「JISコード」として処理すれば(UTF-8に変換したいなら変換すれば)OKです。

abu-abucc
質問者

お礼

ご回答ありがとう御座います。 教えていただいたページを熟読し、ASCIIコード表、JISコード表を並べて見ているうちにおぼろげながら解決の糸口が見えてきました。 =1B$B"(%a!<%k1\MwL5NA"(=1B(B の 最初と最後の「=1B」がASCIIコードで言うところの「ESC」となり、最後の「(B」が改行コード[CR+LF]に該当し、その間に挟まれた部分の文字列が全て「表現可能な 0x21~0x30 と 0x32~0x7E の文字」で構成されている訳なのですね。 後はデータとしての「=」の部分である「=3D」と英数字単語の部分に注意しつつ、正規表現を使ってデコード対象を抽出すれば良いみたいですね。 「表現可能な英数字」と「英数字単語」の判定に一工夫必要ですが頑張ってコードを書いてみます。 ありがとう御座いました。

abu-abucc
質問者

補足

覚え書きも含めた自己補完です。 =1B$B ~ =1B(B の間がエンコードされた部分で、英数字単語の部分も =1B$B ~ =1B(B で判定可能。 例えば =1B$B***********=1B(BMessage123=1B$B**********=1B(B という部分が有ったら、(*は任意のエンコードされた文字列)  =1B(B がエンコード終了位置となり、「 Message123 」に続く =1B$B からがエンコード再開位置になるのですね。 ↓の「回答のお礼」に書いた、「 (B は改行・・・」の認識は誤りでした。 結局、quoted_printable_decode()関数の出番は無く、 preg_replace()関数   ↓ bin2hex()関数   ↓ 試験中(4文字ペア=JISコードで抜き出して文字に直す) の様な処理でデコード出来そうです。 特殊文字が多く含まれるので、不特定多数の利用が想定されるWEBアプリケーションなどでは、飛んでくる文字列に対してしっかりエスケープしないと脆弱性につながりそうです..。

関連するQ&A

  • デコードに困っています。

    エンコードされた文字をrawurldecodeでデコードしたいのですが、Shift_JISやEUC、UTF-8によってデコードされる形が異なります。 METAでShift_JISを指定してればShift_JISでエンコードされた値もデコードすればしっかりと表示されます。しかしUTF-8など異なるタイプではMETAがShift_JISなのでしっかりと表示されません。どうすればすべてのタイプに対応させることが可能なのでしょうか?

    • 締切済み
    • PHP
  • MIMEでエンコードされたMailのSubjectのデコード、エンコード

    mailにおいて、MIMEにてエンコードされたSubject: の内容をテキストに落とすと例えば下のような エンコードされた文字列になります。 これをデコードし、かつエンコードするための VisualC++のコードを教えてください。 Subject: =?ISO-2022-JP?B?GyRCJTUlcyVXJWslYSUkJWsbKEI=?= よろしくお願いします。

  • [ 文字列 -> ファイル ] BASE64デコード

    文字列又は、クリップボードから、 指定した保存先にファイルとして、 BASE64デコード出来るソフトは、ないでしょうか? アップロード機能のないブログサービスで、 公開したい文書などをBASE64エンコードして、 公開しているのですが、初心者でも分かり易く、 ダウンロードしてもらうために、 上記のようなソフトがあればと探しているのですが、 見つかりません。 何か、良い方法がございましたら、 教えてください。よろしくお願いします。

  • 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
  • base64_decodeに関して

    base64でエンコードされたPHPソースをデコードし、 その内容を表示させるスクリプト(base64.php)を 実行すると、ブラウザには decode.txt の様に 文字化けした内容が表示されます。 元のソースを表示させる方法は無いでしょうか? base64.php、decode.txt は以下よりダウンロードし、 検討して下さい。 ================================================================ http://www.hp-toolbox.com/base64_decode.zip ================================================================ 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • シフトJISにてデコード 文字化け

    EUC-JPを用いてエンコードすると「A4 AD A4 AB A4 A4 A4 AB A4 AC A4 AF BA B0 BD」となった文字列を保存したテキストをシフトJISでデコードした場合に表示される文字列は何ですか?文字化けするらしいのですがわかりません。分かる方教えてください!

  • メールのデコードについて(RFC2231)

    よろしくお願いいたします。 メーラー(Becky!やALMAIL等)によっては、RFC2231形式で添付ファイル名をエンコードして送信していますが、RFC2231形式で送信された添付ファイル名をデコードする方法をご教授いただきたく。 下記の@ITで紹介された記事によるとRFC2231形式は%の後ろ2文字の16進数がエンコードされた文字コードであるとなっています。 http://www.atmarkit.co.jp/fnetwork/rensai/netpro04/netpro01.html しかし、Becky!等のメーラーでは、下記の【】内のように、%の間が2文字以上の場合や、ASCII文字列は直接埋め込まれてしまうパターンがあります。 【filename*=iso-2022-jp''%1B%24B%24%5B%242%24%5B%242%1B%28B%2Etxt】→元は【ほげほげ.txt】 ASCII文字列が直接埋め込まれている部分は何とかなるとして、%24B%のような部分はどのようにデコードするのでしょうか? もしかしてBはBASE64?

  • 文字列について

    文字列をEUC-JPを用いてエンコードして保存したテキストをシフトJISにてデコードした場合に表示される文字を示せ。 JIS X 0208区点番号表は与えられています。 分かる方いれば是非教えてください。

  • mb_decode_numericentity引数

    10進数数値文字参照を文字列に変換したいです。 (「変… こういうヤツを日本語にしたい) mb_decode_numericentity第2引数に >convmap は変換するコード領域を指定する配列です とあるのですが、これはどうやって指定するのでしょうか? PHP: mb_decode_numericentity - Manual http://jp2.php.net/mb_decode_numericentit 下の方に $convmap = array (0x0, 0xffff, 0, 0xffff); $output = mb_decode_numericentity($intput, $convmap, 'UTF-8'); と書かれているのですが、「0x0, 0xffff, 0, 0xffff」の意味が分かりません。 「10進数数値文字」を変換したい時は、ここをどう書けば良いのでしょうか?

    • ベストアンサー
    • PHP
  • base64?デコード?

    「テキストファイルを送るからデコードして使って」と言われ、 下記のような内容のファイルをもらったのですが、デコードとはどうすればいいのでしょうか? ・1つ目のテキストファイル "begin-base64 664 ○○(ファイル名).zip&#xA;fsjiiafaBABAEakhajkiij~(以降ランダムな文字列)" info="base64&gt;&gt;zip" ・2つ目のテキストファイル "FkufaskKKSDOkaklaaeiijjn~(以降ランダムな文字列)=" info="○○(ファイル名)&#xA;base64-&gt;rar" ネットで調べて、「このテキストファイルをバイナリソフトでデコードすれば目的のファイルになる」 ということはわかったんですが、 テキストの中のどこからどこまでをコピーすればいいのかわかりません。 ランダムな文字列の部分だけの新しいテキストファイルをつくってデコードをしたんですがエラーが出ました。 エンコードしたソフトでデコードすればいいのでしょうか? よろしくお願いいたします。