次のようにメールを送信しようとしています。
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に変換できるのでしょうか。
よろしくお願いします。
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コードに変換する
という意味です。
この回答への補足
回答ありがとうございます。
メーラーの機能でデコードしてくれていたとうことですね。
encode_base64は指定することにします。
モジュールについては、まだよくわかりません。
encodingというのはモジュールですよね?
(1)これがどのパッケージに含まれているとかどこにあるのかを調べるには、
どうすればよいのでしょうか。
(2)宣言しているのはencodingで、使っているのはEncodeパッケージの
encodeモジュールなのが腑に落ちません。
(3)use encoding 'utf8';と指定すると、このPerlスクリプトがutf8で
書かれていることになるのでしょうか。
それとも、Encoding::encodeの()内の第2引数で指定された文字列のみが
utf8であると解釈されるのでしょうか。
もし後者であるなら、useで宣言するよりEncoding::encodeの()内で、
第3引数として指定するほうが自然な気もします。
(4)実験で失敗した方法は、何が間違っているために失敗したのでしょうか。
No.7
- 回答日時:
encoding モジュールとか、encodeモジュールといったものは無いと思います。
(Encodeモジュールはあっても)↓
encoding パッケージ、encodeパッケージといったものは無いと思います。(Encodeパッケージはあっても)
これを理解するには予備知識が不足してるというのがわかりした。
まずそのあたりを自分で調べてから質問します。
でも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を読み込んでいないために関数が定義されていないというエラーが出るのでは?と思います。
この回答への補足
こんばんは、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/あたりを見てるようですけど、
ここ以外にも見てるとも思います。
このパッケージとモジュールの仕組みがわかれば、大きなプログラムを書くときに
必要なことが理解できてくるような気がします。
よろしくお願いします。
No.2
- 回答日時:
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 …
わかる範囲でけっこうですのでご教示ください。
よろしくお願いします。
No.1
- 回答日時:
jcode.plって、Unicodeに対応してないのでは。
文字コード変換に悩むくらいなら、HTML形式のメールにして、UTF-8のまま送っては。
最近のメーラなら大抵対応してるかと。 # 携帯はよくわからないけど。
この回答への補足
Fedora Coreを使っている人はどうされているんでしょう?
UTF-8のまま送る方法以外に、何か代わりのよい方法はありませんか?
携帯に送ることを想定しているわけじゃないのです。
せめてOutlookとか一般的なメーラーで受信した時に文字化けしないようにしたいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- PHP phpの imap_search で漢字コード 1 2022/09/06 17:32
- C言語・C++・C# S-JIS → JIS コード変換するには 3 2023/02/09 23:55
- その他(プログラミング・Web制作) Sikulix2.0.5(Jython2.7.3)でcsvを読込WEB検索条件にpasteで文字化け 1 2023/03/31 11:02
- PHP 10文字以降は非表示にしたいんですが、文法が分かりませんアドバイスお願い致します 1 2022/07/10 20:37
- その他(Microsoft Office) WordやExcelで英数字のみ半角または全角にしたい 6 2022/08/03 08:18
- Visual Basic(VBA) エクセル VBA メール本文に指定セルに記載されているURLをリンクとして記載する方法 8 2022/08/08 07:50
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- マウス・キーボード 教えて! AppleのMagic Keyboard(JIS)をWindows 10で使用次第のですが 2 2022/06/01 18:07
- Java VScodeのターミナルの文字化けについて 1 2022/09/27 22:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
pythonエラー
-
quoted-printableのアルゴリズム
-
IMAP4でsubjectが検索ヒットしない
-
CSVファイルの中で、「 , 」カ...
-
全角英数字の必要性が理解できない
-
英数字のみ全角から半角に変換
-
マクロを使ってフォルダー内に...
-
IEからEdgeへの移行に伴うIMEの...
-
エクセルで数値を全角文字(カ...
-
CString から LPCTSTRの型に変換
-
Excel VBAでPDFファイルをMicro...
-
WORDで改ページすると時々グレ...
-
EXCELからCSVにすると余計なカ...
-
「何とかで始まり、何とかで終...
-
VBA 文字に半角が含まれて...
-
VB.net、テキストボックス入力...
-
VBA 置換文字がみつからない時
-
エクセルにMicrosoft Barcode C...
-
COBOL・全角判定
-
char型全角数字から、int型半角...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
pythonエラー
-
BASP21によるbase64のデコード...
-
Perl:ファイル名だけ文字化けする
-
「繝・せ繝・」となる文字化け
-
MIMEでエンコードされたMailのS...
-
jcode.pmでconvertできない
-
1つのサイトで文字コードが混在...
-
Encode.pmで文字コードの判別
-
メール(iso-2022-jp-2)のデコ...
-
jisコードで16進数の『3c』か...
-
URLエンコードされたデータを戻...
-
文字コードについて
-
perlの日本語文字コードはどう...
-
CASLIIの数値データ入出力
-
CGIでメールを送る際に文字...
-
CSVファイルの中で、「 , 」カ...
-
英数字のみ全角から半角に変換
-
エクセルで数値を全角文字(カ...
-
EXCELからCSVにすると余計なカ...
-
住宅にカナを入力する際に丁目...
おすすめ情報