アプリ版:「スタンプのみでお礼する」機能のリリースについて

次のようにメールを送信しようとしています。
Fedora CoreはUTF-8なので、jcode.plでJISに変換しようとしています。

require "jcode.pl";
$subject = "テストメール";
$data = "これはテストメールです。";
&jcode::convert(\$subject,'jis');
&jcode::convert(\$data,'jis');
@str = "subject:$subject\n\n");
push (@str, "$data\n.\n");

これがなぜかうまくいきません。メーラーの文字コードをutf8にすると正常に表示されます。
使い方が違うのかと思ったので、次のように変えてみたところ、エラーになりました。

&jcode::convert(\$subject,'utf8','jis');

また、先頭にuse utf8;を付けてみたところ、送信できたものの文字化けが余計ひどくなりました。
インターネットで検索したり本を読んでみたりしても、よくわかりませんでした。
どうやったらJISに変換できるのでしょうか。
よろしくお願いします。

A 回答 (7件)

>また、ヘッダ部分はBase64エンコードしないと文字化けするということを


どこかのサイトで書いてありましたが、今回はMIME::Base64パッケージは
特に使ってなく、encode_base64($subject)もコメントアウトしています。
でも件名も内容も全く文字化けしていません。これはなぜでしょうか?

メーラーの機能のおかげです。
RFCと呼ばれる事実上標準となっている規定ではBase64エンコードすべしと規定されているのですが、メーラーによっては、Base64エンコードされていなくてもjisコード変換してあれば解釈してくれます。ただし、どんなメーラーでも読めるという保証はなく、一般のメーラで読める保証があるのはBase64エンコードされている場合のみです。


>use encoding 'utf8';
>…
>$subject = Encode::encode("jis", $str);

自分の環境がutf8であることを宣言。
$strが宣言されたutf8コードで書かれているとして、
jisコードに変換する
という意味です。

この回答への補足

回答ありがとうございます。
メーラーの機能でデコードしてくれていたとうことですね。
encode_base64は指定することにします。

モジュールについては、まだよくわかりません。
encodingというのはモジュールですよね?

(1)これがどのパッケージに含まれているとかどこにあるのかを調べるには、
どうすればよいのでしょうか。

(2)宣言しているのはencodingで、使っているのはEncodeパッケージの
encodeモジュールなのが腑に落ちません。

(3)use encoding 'utf8';と指定すると、このPerlスクリプトがutf8で
書かれていることになるのでしょうか。
それとも、Encoding::encodeの()内の第2引数で指定された文字列のみが
utf8であると解釈されるのでしょうか。
もし後者であるなら、useで宣言するよりEncoding::encodeの()内で、
第3引数として指定するほうが自然な気もします。

(4)実験で失敗した方法は、何が間違っているために失敗したのでしょうか。

補足日時:2006/04/06 22:58
    • good
    • 0

encoding モジュールとか、encodeモジュールといったものは無いと思います。

(Encodeモジュールはあっても)


encoding パッケージ、encodeパッケージといったものは無いと思います。(Encodeパッケージはあっても)
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/04/08 16:01

*encoding*



*encoding*


でした。
find `perl -e 'print "@INC"'` -name '*encoding*' -print | grep encoding
    • good
    • 0

(1)


*encoding*

encoding

grep encode

grep encoding
にしてください。
探しているのはencodeでなく、encodingですよね?

(2)
encoding
はパッケージではなく、プラグマと呼ばれるものです。
詳細はgoogleなどで調べて下さい。
use strict;
とかと同種のものです。
やっていることは
$ man encoding
を参照してください。
これと、スカラーの内容をコード変換する
Encode::encode
が独立にあってもなんらおかしいことないです。
おかしいと感じる理由がわかりません。
質問と言うより感想に近い?のかな?というより他ないです。ごめんなさい。

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

(4)
useでパス指定してない場合はどこを参照してるのか疑問です。

@INC
にある部分以外見ているのか、私は知りません。
    • good
    • 0

(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を読み込んでいないために関数が定義されていないというエラーが出るのでは?と思います。

この回答への補足

こんばんは、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/あたりを見てるようですけど、
ここ以外にも見てるとも思います。

このパッケージとモジュールの仕組みがわかれば、大きなプログラムを書くときに
必要なことが理解できてくるような気がします。

よろしくお願いします。

補足日時:2006/04/08 02:13
    • good
    • 0

Perl のバージョンによるんだけど, 5.8 以降なら


use encode;
とかでなんとかするんでしょう.
それより前なら最新のものに入れ替えるということで.

この回答への補足

回答ありがとうございます。
おかげさまで、とりあえず文字化けしない方法を発見しました。
でも、まだきちんと理解できていないことがあります。
そもそもパッケージやらモジュールやらがあまりよく理解できていません。
なので、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_unic …

わかる範囲でけっこうですのでご教示ください。
よろしくお願いします。

補足日時:2006/04/03 23:29
    • good
    • 0

jcode.plって、Unicodeに対応してないのでは。



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

この回答への補足

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

補足日時:2006/04/01 19:49
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!