- ベストアンサー
Perlメール文字化けの問題と解決法
- Perlを使用してメール送信を作成している中で、文字化けの問題が発生しています。パソコン同士のメール送信では文字化けが解消されたが、異字体の文字化けが発生しています。また、スマホへのメール送信では全ての文字が化ける状態です。解決法としては、パソコンでの文字化けには「Content-Transfer-Encoding: 8bit」を使用することが考えられますが、具体的な使い方が分かりません。スマホでの文字コードについても調査が必要です。
- 問題は主に2つあります。まず、パソコン同士のメール送信では文字化けが解消されましたが、異字体の文字化けが発生しています。この問題を解決するには、メール送信時に「Content-Transfer-Encoding: 8bit」を使用すると良いでしょう。具体的な使い方については、ドキュメントやネット上で調べてみてください。次に、スマホへのメール送信では全ての文字が化ける状態です。この問題は、スマホでの文字コードに起因している可能性があります。具体的な文字コードについては、スマホの仕様やドキュメントを確認してみてください。
- Perlを使用してメール送信を作成していますが、文字化けの問題が発生しています。パソコン同士のメール送信では一部の異字体が文字化けしてしまいます。解決策としては、「Content-Transfer-Encoding: 8bit」を使用することが考えられますが、具体的な使い方が分かりません。また、スマホへのメール送信では全ての文字が化けてしまいます。スマホの文字コードについても調査が必要です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>Encode::from_to($Name 'cp932', 'utf-8',); 意味わかって使っていますか? $Nameに文字コードCP932の文字列が入ってるから、それを文字コードUTF-8に変換して$Nameにいれてという意味ですよ? 元の$Nameに入っている文字列の文字コードは何なのですか? CP932以外でしたら嘘を教えてるんだからおかしな変換されても当然です。
その他の回答 (3)
- superside0
- ベストアンサー率64% (463/719)
$headerで UTF-8 を指定しているのに 本文を 、'cp932'(SJIS)にしているのではあれば、文字化けするのは 当然です。 (PCで文字化けしなくなったのは、たまたまそのメーラーが 気を利かしてくれだだけでしょう) ヘッダでの宣言と 実体を一致させれば(1)は 解決します。
お礼
ありがとうございます。
補足
ということは Content-Type: text/plain; charset = "utf8" ↓ Content-Type: text/plain; charset = "cp932" ということでしょうか? これでも文字化けはしないです・・・ Content-Type: text/plain; charset = "utf8" これのまま Encode::from_to($Name 'cp932', 'utf-8',); こうすると文字化けします。。。 ただやはりどちらにしてもスマホで文字化けします・・・ まだ、完全に文字コード変換について理解できてなくすみません;;
- superside0
- ベストアンサー率64% (463/719)
(2) > Encode::from_to($start, 'shiftjis', 'iso-2022-jp'); > Encode::from_to($Name, 'utf8', 'shiftjis'); これでは、 $startを sjisからiso-2022-jpへ変換しているのに、 $Nameは utf8からSJISへ変換となっていて 本文中にiso-2020-jp とSJISを混在させてしまっています。 (ソース内で宣言した変数と、POSTされた変数で 変換元のコードが異なるのは 問題ないですが、 変換先が異なるのが問題) なのでまずは 本文で使う変数のコードを統一しましょう。 なにに統一するかというと、$headerの中身の定義が上記にはないですが、 省略されているとして、その中にコードの宣言があるはずです。 例えば $header .= "Mime-Version: 1.0\n"; $header .= "Content-type: text/plain; charset=iso-2022-jp\n"; $header .= "~\n\n"; として charseをiso-2020-jpと宣言しているならば、本文で使う変数のEncode::from_to変換先を 全て 'iso-2022-jp'にします。 (1) ただし、iso-2022-jp を使うと、髙や﨑を送ることができません。 (Outlookとかの一部のメーラーは 例外的に表示してくれますが) よって、POSTデータ(HTML)も、$headerでのメールのコード宣言も、 Encode::from_toでの変換先も 全部UTF-8にしてしまうのが確実でしょう。 (ついでに本文をencode_base64して、メールヘッダでそれを宣言)
お礼
ありがとうございます。
補足
ご回答ありがとうございます。 $startは変換をせずそのまま送ることにしました。 それでパソコンでは文字化けはしなくはなりました。 HTMLフォームから受け取ったデータに関しては そのまま送ると文字化けするみたいなので Encode::from_to($Name, 'utf-8', 'cp932'); このように記載するとパソコンでは文字化けしなくはなったのですが、 $startはそのまま送る $NameはEncode::from_to($Name, 'utf-8', 'cp932'); で送る だとスマホでは文字化けしてしまいます。 $header は下記のようになってます。 my $header = <<"MAILHEADER"; From: $from To: $mailto CC: $mailcc Subject: $subject Mime-Version: 1.0 Content-Type: text/plain; charset = "utf8" Content-Transfer-Encoding: 8bit MAILHEADER ただこれが効いているのかがわからないです。。。
- muuming2001
- ベストアンサー率23% (202/847)
髙ってShift_JISには存在していない文字では?
お礼
ありがとうございます。
補足
回答ありがとうございます。 >髙ってShift_JISには存在していない文字では? だと思い my $Name =$q->param('Name'); Encode::from_to($Name, 'utf8', 'shiftjis'); 例えば ホームページの名前入力欄からのデータの受け渡しが上記のコードのName なのですが、 これはutf8に変換するという形にしたつもりなのですが・・・
お礼
ありがとうございました。 結果的には・・ HTML(シフトJIS)だったらPerlでシフトJISからUTF-8に変換して送る ということですよね・・
補足
そういうことですか・・・ まだしっかり理解ができておりません;; 元々はUTF8だと思うので Encode::from_to($Name, 'utf-8', 'cp932'); ということですね・・・ これではパソコンでは文字化けしません! しかし、スマホでは文字化けします;; これはスマホがcp932が対応していないということでしょうか・・・?