• ベストアンサー

BASE64エンコード(mimew.pl)について!

mimew.plを使ったBASE64エンコードについて質問です。 内容:ABCのTESTメール という文字列をmimew.plでmimeencodeしたとすると、 内容: ABC の TEST メール と英字の前後にスペースが入ってしまいます。 これをスペースが入らないようにしたいです。 また、 内 容:ABCのTESTメール という文字列をmimew.plでmimeencodeしたとすると、 内容:ABCのTESTメール このようにスペースが削除されてしまいます。 これをスペースが消えないようにするには、 どうしたらいいのでしょうか? mimew.plを使用しなくてもいいので、 これらの事が出きるようになればOKです。 サーバはXREAのものを使用しています。(nkf使用可) 宜しくお願いします。

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

  • ベストアンサー
  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.3

mimew.plを使う場合、MIME::BASE64を使う場合のどちらの場合でもエンコードをかけてるのはEUCではなくJIS(ShiftJISではない)でなければいけません。 JISでエンコードをかけなければISO-2022-JPを名乗ることはできません。 (ISO-2022-JP = JISということです) http://e-words.jp/w/ISO-2022-JP.html 以下はEUC→JISへの変換部分も含むエンコード例です。 use Jcode; #EUC→JISへの変換のためにJcode.pmを呼ぶ $subject = &mime_unstructured_header('Subject: ABCのTESTメール'); #日本語部分はEUCとする sub add_encoded_word { my($str,$line) = @_; my($result); my($ascii) = '[\x00-\x7F]'; my($twoBytes) = '[\x8E\xA1-\xFE][\xA1-\xFE]'; my($threeBytes) = '\x8F[\xA1-\xFE][\xA1-\xFE]'; while (length($str)) { my $target = $str; $str = ''; if(length($line) + 22 + ($target =~ /^(?:$twoBytes|$threeBytes)/o) * 8 > 76){ $line =~ s/[ \t\n\r]*$/\n/; $result .= $line; $line = ' '; } while (1) { my $encoded = '=?ISO-2022-JP?B?' . &base64("encode",jcode($target,"euc")->jis) . '?='; if(length($encoded) + length($line) > 76){ $target =~ s/($threeBytes|$twoBytes|$ascii)$//o; $str = $1 . $str; }else{ $line .= $encoded; last; } } } $result . $line; } sub mime_unstructured_header { my($oldheader) = shift; my($header,@words,@wordstmp,$i) = (''); my $crlf = $oldheader =~ /\n$/; $oldheader =~ s/\s+$//; @wordstmp = split(/\s+/,$oldheader); for($i = 0; $i < $#wordstmp; $i++){ if($wordstmp[$i] !~ /^[\x21-\x7E]+$/ and $wordstmp[$i + 1] !~ /^[\x21-\x7E]+$/) { $wordstmp[$i + 1] = "$wordstmp[$i] $wordstmp[$i + 1]"; }else{ push(@words, $wordstmp[$i]); } } push(@words, $wordstmp[-1]); foreach $word (@words){ if($word =~ /^[\x21-\x7E]+$/){ $header =~ /(?:.*\n)*(.*)/; if(length($1) + length($word) > 76){ $header .= "\n $word"; }else{ $header .= $word; } }else{ $header = &add_encoded_word($word, $header); } $header =~ /(?:.*\n)*(.*)/; if(length($1) == 76){ $header .= "\n "; }else{ $header .= ' '; } } $header =~ s/\n? $//mg; $crlf ? "$header\n" : $header; }

参考URL:
http://e-words.jp/w/ISO-2022-JP.html
noname#191236
質問者

お礼

EUCの件については、とあるサイトに書いてあった内容を 少し勘違いして受け取っていました。 先ほど、Jcodeを使ってみたら出来ました。 この質問の前にJcode.pmを使ってmime_encodeしてみても出来なかったのですが、Jcodeのサイトに書いてある内容が 違っていた為でした。 (その簡単な間違いに気づかなかった自分が情けないです・・・) エンコード例について、参考にさせて頂きます。 色々とアドバイス回答を頂き本当にどうもありがとうございました。

その他の回答 (2)

  • okiyoshi
  • ベストアンサー率34% (11/32)
回答No.2

> BASE64モジュールを使うとエラーが出たりして出来ませんでした。 どんなエラーでしょう? > あと、BASE64モジュールでエンコードの際はeucでなくてもいいのでしょうか? BASE64によるエンコードはデータをバイナリとしてみるのでコード体系は関係ないのではないかと思います。 参考 http://www.sea-bird.org/doc/Cygwin/BASE64enc.html > 他の方法があればお願いします。 私も素人なので他の識者の方にお願いします。

noname#191236
質問者

お礼

色々とアドバイス回答を頂き本当にどうもありがとうございました。

noname#191236
質問者

補足

再度投稿していただきありがとうございます。 ScriptErrorと出てしまいます。 (そのcgiは、構文を手動・自動でチェックしてあり間違いはないと思います。)

  • okiyoshi
  • ベストアンサー率34% (11/32)
回答No.1

mimew.plが何かは知りませんが、 MIME::Base64モジュールを使うというのはどうでしょう? 組込なので別途インストールは不要と思います。 use strict; use MIME::Base64; my $str1 = '内容:ABCのTESTメール'; my $str2 = '内 容:ABCのTESTメール'; print "$str1\n"; print "$str2\n"; $str1 = encode_base64( $str1 ); $str2 = encode_base64( $str2 ); print "$str1\n"; print "$str2\n"; $str1 = decode_base64( $str1 ); $str2 = decode_base64( $str2 ); print "$str1\n"; print "$str2\n";

noname#191236
質問者

お礼

メール送信の際に使いたいので、出来れば =?ISO-2022-JP?B? ?=を自動で負荷してくれるものがいいです。

noname#191236
質問者

補足

投稿ありがとうございます。 BASE64モジュールを使うとエラーが出たりして出来ませんでした。 あと、BASE64モジュールでエンコードの際はeucでなくてもいいのでしょうか? 他の方法があればお願いします。

関連するQ&A

専門家に質問してみよう