• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:メールを文字化けしないようにしたい)

メールの文字化け対策とは?

このQ&Aのポイント
  • メールを送信する際に文字化けしないようにする方法を探しています。
  • 現在、メール送信時に文字化けの問題が発生しており、UTF-8からJISに変換しようとしていますがうまくいきません。
  • 文字化けの対策方法について検索や参考書を調べましたが、解決策が見つかりません。JISへの変換方法を教えていただきたいです。

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

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

>また、ヘッダ部分はBase64エンコードしないと文字化けするということを どこかのサイトで書いてありましたが、今回はMIME::Base64パッケージは 特に使ってなく、encode_base64($subject)もコメントアウトしています。 でも件名も内容も全く文字化けしていません。これはなぜでしょうか? メーラーの機能のおかげです。 RFCと呼ばれる事実上標準となっている規定ではBase64エンコードすべしと規定されているのですが、メーラーによっては、Base64エンコードされていなくてもjisコード変換してあれば解釈してくれます。ただし、どんなメーラーでも読めるという保証はなく、一般のメーラで読める保証があるのはBase64エンコードされている場合のみです。 >use encoding 'utf8'; >… >$subject = Encode::encode("jis", $str); 自分の環境がutf8であることを宣言。 $strが宣言されたutf8コードで書かれているとして、 jisコードに変換する という意味です。

noname#17299
質問者

補足

回答ありがとうございます。 メーラーの機能でデコードしてくれていたとうことですね。 encode_base64は指定することにします。 モジュールについては、まだよくわかりません。 encodingというのはモジュールですよね? (1)これがどのパッケージに含まれているとかどこにあるのかを調べるには、 どうすればよいのでしょうか。 (2)宣言しているのはencodingで、使っているのはEncodeパッケージの encodeモジュールなのが腑に落ちません。 (3)use encoding 'utf8';と指定すると、このPerlスクリプトがutf8で 書かれていることになるのでしょうか。 それとも、Encoding::encodeの()内の第2引数で指定された文字列のみが utf8であると解釈されるのでしょうか。 もし後者であるなら、useで宣言するよりEncoding::encodeの()内で、 第3引数として指定するほうが自然な気もします。 (4)実験で失敗した方法は、何が間違っているために失敗したのでしょうか。

その他の回答 (6)

回答No.7

encoding モジュールとか、encodeモジュールといったものは無いと思います。(Encodeモジュールはあっても) ↓ encoding パッケージ、encodeパッケージといったものは無いと思います。(Encodeパッケージはあっても)

noname#17299
質問者

お礼

これを理解するには予備知識が不足してるというのがわかりした。 まずそのあたりを自分で調べてから質問します。 でもHoComeComeさんのおかげで何を調べればよいかがはっきりしました。 最初の質問から話題がそれてしまっているので、この質問は締め切ります。 おかげさまで助かりました。ありがとうございました。

回答No.6

*encoding* を *encoding* に でした。 find `perl -e 'print "@INC"'` -name '*encoding*' -print | grep encoding

回答No.5

(1) *encoding* を encoding に grep encode を grep encoding にしてください。 探しているのはencodeでなく、encodingですよね? (2) encoding はパッケージではなく、プラグマと呼ばれるものです。 詳細はgoogleなどで調べて下さい。 use strict; とかと同種のものです。 やっていることは $ man encoding を参照してください。 これと、スカラーの内容をコード変換する Encode::encode が独立にあってもなんらおかしいことないです。 おかしいと感じる理由がわかりません。 質問と言うより感想に近い?のかな?というより他ないです。ごめんなさい。 encoding モジュールとか、encodeモジュールといったものは無いと思います。(Encodeモジュールはあっても) (4) useでパス指定してない場合はどこを参照してるのか疑問です。 @INC にある部分以外見ているのか、私は知りません。

回答No.4

(1)これがどのパッケージに含まれているとかどこにあるのかを調べるには、 どうすればよいのでしょうか。 Linux環境なら、 # locate encoding | grep perl 結果は /usr/lib/perl5/5.8.6/i386-linux-thread-multi/auto/PerlIO/encoding /usr/lib/perl5/5.8.6/i386-linux-thread-multi/auto/PerlIO/encoding/encoding.so /usr/lib/perl5/5.8.6/i386-linux-thread-multi/PerlIO/encoding.pm /usr/lib/perl5/5.8.6/i386-linux-thread-multi/encoding.pm また、 # man encoding は最低やって下さい。 (2)宣言しているのはencodingで、使っているのはEncodeパッケージの encodeモジュールなのが腑に落ちません。 別におかしくはないと思います。 (3)use encoding 'utf8';と指定すると、このPerlスクリプトがutf8で 書かれていることになるのでしょうか。 そうです。 それとも、Encoding::encodeの()内の第2引数で指定された文字列のみが utf8であると解釈されるのでしょうか。 Encodingというパッケージあります? Encode::encode でなくて? (4)実験で失敗した方法は、何が間違っているために失敗したのでしょうか。 ほとんどモジュールの読み込み時点で失敗してるようです。 cgiにしないで、ローカル環境においてスクリプト実行時で正常にうごいているのか調べて下さい。モジュールの読み込み、および、Encodeを読み込んでいないために関数が定義されていないというエラーが出るのでは?と思います。

noname#17299
質問者

補足

こんばんは、HoComeComeさん。 もう少しで解決しそうですのでお願いします。 (1) # locate encoding | grep perl # slocate encoding | grep perl ともに以下のエラーとなりました。 warning: locate: Could not find the group: slocate in the /etc/group file. fatal error: This is a result of the group missing or a corrupted group file. # find `perl -e 'print "@INC"'` -name '*encode*' -print | grep encode では、以下が表示されました。 /usr/lib/perl5/5.8.5/Encode/encode.h /usr/lib/perl5/vendor_perl/5.8.5/Convert/ASN1/_encode.pm /usr/lib/perl5/vendor_perl/5.8.5/Convert/ASN1/_encode.pm でもこれらは、.hはヘッダだし、_encode.pmはアンダーバーがついているので違うと思います。 どこにあるか現状探せてません。どうすれば見つけられるのでしょうか。 (2) 宣言してるのはencodingモジュールですよね? でも使ってるところはEncodeパッケージのencodeモジュールですよね。 解釈のしかたが間違っているのかもしれません。 encodingモジュールなのかencodeモジュールなのかどちらなのでしょうか? (3) useで宣言したら、require encodingされてからimport関数にutf8という引数が渡されるのはわかりました。 これがモジュール側で定義されているというのを確認したいです。 Encoding::encodeは誤りです。正しくはEncode::encodeでした。 Encodeパッケージのencodeモジュールですね。 (4) そんなモジュールはないというエラーですね。 useでパス指定してない場合はどこを参照してるのか疑問です。 /usr/lib/perl5/vendor_perl/5.8.5/あたりを見てるようですけど、 ここ以外にも見てるとも思います。 このパッケージとモジュールの仕組みがわかれば、大きなプログラムを書くときに 必要なことが理解できてくるような気がします。 よろしくお願いします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

Perl のバージョンによるんだけど, 5.8 以降なら use encode; とかでなんとかするんでしょう. それより前なら最新のものに入れ替えるということで.

noname#17299
質問者

補足

回答ありがとうございます。 おかげさまで、とりあえず文字化けしない方法を発見しました。 でも、まだきちんと理解できていないことがあります。 そもそもパッケージやらモジュールやらがあまりよく理解できていません。 なので、useでモジュールを読み込むのも何を指定しているのか、 自分でよくわからずにいろいろ試してみました。 その結果を下にまとめましたので、それぞれについてどういう状態なのか 教えていただけますでしょうか。 1 --- 失敗(Internal Server Error) ---------- use encode; … $subject = Encording::encode("jis", $str); ------------------------------------------ 2 --- 失敗(Internal Server Error) ---------- use encode; … $subject = encode("jis", $str); ------------------------------------------ 3 --- 失敗(文字化け) ----------------------- use Encode; … $subject = encode("jis", $str); ------------------------------------------ 4 --- 失敗(文字化け) ----------------------- use Encode; … $subject = Encode::encode("jis", $str); ------------------------------------------ 5 --- 失敗(Internal Server Error) ---------- use encoding; … $subject = Encode::encode("jis", $str); ------------------------------------------ 6 --- 失敗(Internal Server Error) ---------- use encoding 'jis'; … $subject = Encode::encode("jis", $str); ------------------------------------------ 7 --- 失敗(Internal Server Error) ---------- use Encode::encoding 'utf8'; … $subject = Encode::encode("jis", $str); ------------------------------------------ 8 --- 失敗(Internal Server Error) ---------- use encoding 'utf8'; … $subject = encode("jis", $str); ------------------------------------------ 9 --- 成功 --------------------------------- use encoding 'utf8'; … $subject = Encode::encode("jis", $str); ------------------------------------------ また、ヘッダ部分はBase64エンコードしないと文字化けするということを どこかのサイトで書いてありましたが、今回はMIME::Base64パッケージは 特に使ってなく、encode_base64($subject)もコメントアウトしています。 でも件名も内容も全く文字化けしていません。これはなぜでしょうか? さらに、次のサイトにUTF-8フラグというものがあります。 これが何なのかもよくわかりません。 http://www.pure.ne.jp/~learner/program/Perl_unicode.html#flg_write わかる範囲でけっこうですのでご教示ください。 よろしくお願いします。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

jcode.plって、Unicodeに対応してないのでは。 文字コード変換に悩むくらいなら、HTML形式のメールにして、UTF-8のまま送っては。 最近のメーラなら大抵対応してるかと。 # 携帯はよくわからないけど。

noname#17299
質問者

補足

Fedora Coreを使っている人はどうされているんでしょう? UTF-8のまま送る方法以外に、何か代わりのよい方法はありませんか? 携帯に送ることを想定しているわけじゃないのです。 せめてOutlookとか一般的なメーラーで受信した時に文字化けしないようにしたいです。

関連するQ&A