- ベストアンサー
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使用可) 宜しくお願いします。
- みんなの回答 (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; }
その他の回答 (2)
- okiyoshi
- ベストアンサー率34% (11/32)
> BASE64モジュールを使うとエラーが出たりして出来ませんでした。 どんなエラーでしょう? > あと、BASE64モジュールでエンコードの際はeucでなくてもいいのでしょうか? BASE64によるエンコードはデータをバイナリとしてみるのでコード体系は関係ないのではないかと思います。 参考 http://www.sea-bird.org/doc/Cygwin/BASE64enc.html > 他の方法があればお願いします。 私も素人なので他の識者の方にお願いします。
お礼
色々とアドバイス回答を頂き本当にどうもありがとうございました。
補足
再度投稿していただきありがとうございます。 ScriptErrorと出てしまいます。 (そのcgiは、構文を手動・自動でチェックしてあり間違いはないと思います。)
- okiyoshi
- ベストアンサー率34% (11/32)
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";
お礼
メール送信の際に使いたいので、出来れば =?ISO-2022-JP?B? ?=を自動で負荷してくれるものがいいです。
補足
投稿ありがとうございます。 BASE64モジュールを使うとエラーが出たりして出来ませんでした。 あと、BASE64モジュールでエンコードの際はeucでなくてもいいのでしょうか? 他の方法があればお願いします。
お礼
EUCの件については、とあるサイトに書いてあった内容を 少し勘違いして受け取っていました。 先ほど、Jcodeを使ってみたら出来ました。 この質問の前にJcode.pmを使ってmime_encodeしてみても出来なかったのですが、Jcodeのサイトに書いてある内容が 違っていた為でした。 (その簡単な間違いに気づかなかった自分が情けないです・・・) エンコード例について、参考にさせて頂きます。 色々とアドバイス回答を頂き本当にどうもありがとうございました。