dポイントプレゼントキャンペーン実施中!

前回も文字化けについて質問させてもらったものです。
回答者様のヒントのおかげでようやく変換するとこまでたどり着けました
ありがとうございました。
しかし、今回も文字化けについてなのですが・・・

my $Name =$q->param('Name');

Encode::from_to($Name, 'utf8', 'shiftjis'); #パソコンへ送る用
Encode::from_to($Name, 'shiftjis', 'iso-2022-jp'); #スマホへ送る用

$smtp->datasend("名前 : $Name\n\n");

①異字体が文字化けする(髙)(﨑)等
調べると
utf-8
Content-Transfer-Encoding: 8bit
というので処理するという結果が出たのですが
どこにどう記述するのかがわからないです。

②$smtp->datasend("名前 : $Name\n\n");
ここの「名前:」のとこが文字化けするのですが、
これはおそらく'iso-2022-jp'のまま送られているということだと思うのですが、
例えば、「名前:」という文字列を
my $Name =$q->param('Name');
$Nameの前につけて送信してほしいのですが、どのように記述するのでしょうか?

以上の2点についてをどうかご教示お願い致します。

A 回答 (5件)

subject については


https://oshiete.goo.ne.jp/qa/9537567.html
を見ればいいよ... って, なんでこんなピンポイントに類似した質問が (異なるアカウントから) 出てくるのかなぁ.
    • good
    • 0

複数のシステムがいろいろやってるっぽいから, 「完全に対処する」のは不可能かもしれないねぇ. 現状わかっていることは


・とりあえず PC では問題なし
・スマホでは文字化けする
というだけで, ここからは例えば
・実は「スマホ」が cp932 に対応していない
・メールを「スマホ」に送るために経由しているシステムで何なことをしているので問題が発生している
という可能性がすぐに思い浮かぶ (ほかにもあるかもしれん). 前者だったら単純に「cp932 にしない」で済むわけだが, 後者だと本質的にどうにもならんよね.

とりあえず「cp932 にしない」で済むことを祈るくらいかな.
    • good
    • 0
この回答へのお礼

ありがとうございます。

私がしっかりできていなく

my $header = <<"MAILHEADER";
From: $from
To: $mailto
CC: $mailcc
Subject: $subject
Mime-Version: 1.0
Content-type: text/plain;charset=ISO_2022_JP
Content-Transfer-Encoding: 8bit
MAILHEADER

Content-type: text/plain;charset=ISO_2022_JP
この部分を

Content-type: text/plain;charset=Shift_JIS

こういう風に変えるとスマホでも、パソコンでも本文が文字化けされずに表示されました。
原因がわからないです;;

また、これにより今度は、件名subjectが文字化けするようになりました。
そこで、件名の文字化けで検索すると
use MIME::Base64;
を使うようなことを書いていたのですが、これで件名も対策できますでしょうか?

お礼日時:2016/12/01 13:46

かなり大雑把に書いてしまいますが, 例えば「はしご高」は JIS (iso-2022-jp) には存在しません. 従って, iso-2022-jp に変換するならこのような「異体字」の問題は


あきらめる
しかありません.

というか....
最初から Unicode で得られているんだから, それをそのまま送っちゃえばいいんじゃないかなぁ. それに, utf-8 からわざわざ shift-jis を経由して iso-2022-jp にするのも意味不明だよねぇ.
    • good
    • 0
この回答へのお礼

まだまだ理解出来ていない部分が多いからよくわかならくなっています。。。

そのまま送るとこはそのまま送るようにしたら文字化けはなくなりました。
ただHTMLから受け取ったデータだけは下記で対処
Encode::from_to($Name, 'utf-8', 'cp932');

これでパソコンには文字化けはしなくなりました。
しかし、スマホで文字化けが発生してしまいます。

パソコン、スマホ両方に送れるようにするにはどうすればいいのでしょうか?

お礼日時:2016/12/01 10:28

ちょっと確認ですが, 「異字体が文字化けする」というのは具体的には「どのような文字になる」のでしょうか?

    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>「どのような文字になる」のでしょうか?
「髙田」の場合ですと「?田」と?で返ってきます。

お礼日時:2016/11/30 07:36

先のご質問での追記等を読ませていただいた際にも感じていましたが、文字化けの対症療法ばかりに気が向いていて、文字コード体系を理解していないのだと思います。


JIS、Shift_JIS、EUCなどの文字コード表をご覧になったことはありますか?
JISは各バイトの最上位ビットを使用していません。よって1バイトで表現できる最大値は16進表記でx'7F'です。
これに対し、Shift_JISやEUC、UTFは最上位ビットも使用します。よって各バイトで表現できる最大値は同様にx'FF'です。

で。インターネットの歴史にも関わることなので説明が長くなるため省きますが、20年以上昔の通信機器では「文字データは7ビットしか通さない」という物が多くあったのです。つまり8ビットデータを流すと最上位ビットが落ちてデータ化けを起こし受信先では0か1なのかを判別する術がなく復元できなくなるのです。主にこの影響を受けるのはメールとFTPでした。
そんなことがあってインターネット上へ文字データをそのまま流す際の基本は7ビット表現となっています。つまり日本語ならJISです。
しかしその後、1文字に2バイト以上を要する文字データを使用する地域でのインターネット利用が広がって来たことから文字送信時でも8ビット全部を通す機器が一般的となりました。
しかし、各所の仕様に7ビットまでだった時のなごりが残っています。
メールヘッダのContent-Transfer-Encoding:もその一つかと思います。
送信する文字は7ビット表記だよとか8ビット表記だよということを示すヘッダです。
JIS(Content-Type:行のcharsetがISO-2022-JP)以外の場合は8bitを指定します。
JIS(Content-Type:行のcharsetがISO-2022-JP)の場合は7bitを指定します。

---

プログラム中の"名前 : "の文字コードと、変数$Nameの中の文字列の文字コードが異なるだけの事です。
例えば$Nameに対し Encode::from_to($Name, 'utf8', 'shiftjis'); を行って送信しているのでしたら$Nameの中身はShift_JISです。
この状態で、、、

Content-Type: text/plain; charset="Shift_JIS"
Content-Transfer-Encoding: 8bit

として送信したメールを受信側で見ると"名前 : "が文字化けしているのであれば、"名前 : "はShift_JIS以外の文字コードで送信されたということになります。
この場合、8ビット表現を指定して送りましたから送信経路上での各バイトの最上位ビット落ちは無いはずです。

。。。といった具合に自身はプログラム上で何を指定したのか、それに対し何が起きてるのかを整理して行くことです。
プログラムは思った通りには動きません。あなたが作った通りに動いています。
障害を追う際はそのことを忘れない事です。
「へんだなぁ。これこれしかじかでうまく行くはずだよなぁ」と追うとなかなか原因にたどり着きません。

参考まで。


p.s.
確実に送信先を加味した文字コードに文字列変換するのであれば、「送信:」を$Nameに入れ、Webブラウザから送られて来たデータをその後ろにセットしてから文字列変換すればよいだけでは?
    • good
    • 0
この回答へのお礼

またのご回答ありがとうございます。
毎度ヒント頂きありがとうございます;;

>JIS、Shift_JIS、EUCなどの文字コード表をご覧になったことはありますか?
見たのですが、まだまだ基礎知識が備わっていないせいか、
見ても正直さっぱりです。。。
文字化けした文字を見てどれかな?って探す程度ですorz

>「送信:」を$Nameに入れ、Webブラウザから送られて来たデータをその後ろにセットしてから文字列変換すればよいだけでは?
これに関しましては、少し教えて頂いた形とは違うのですが、これのきっかけで

my $Name =$q->param('Name');
Encode::from_to($Name, 'utf8', 'shiftjis'); #パソコンへ送る用
Encode::from_to($Name, 'shiftjis', 'iso-2022-jp'); #スマホへ送る用
my $Name =$q->param('Name');

my $HName = '名前 :';
my $Name =$q->param('Name');
Encode::from_to($Name, 'utf8', 'shiftjis'); #パソコンへ送る用
Encode::from_to($Name, 'shiftjis', 'iso-2022-jp'); #スマホへ送る用
Encode::from_to($HName, 'shiftjis', 'iso-2022-jp');
$smtp->datasend("$HName $Name\n\n");

という風にしました。
一応これで、パソコン、スマホ共に文字化けせず送れました。
ただ、zircon3様がご掲示くれているヒントと違えばまたご指摘お願い致します・・・

異字体に関しては、最初に記載くださった文字コード表が重要になってくるということですか・・・??
まだ理解がしっかりできていなく申し訳ないです;;

お礼日時:2016/11/29 14:21

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